前回に続き東京創業ステーションからPythonセミナーの依頼をいただいております。 今回も初学者向けですが演習テーマは前回と変えているので、前回参加された方もぜひまたご参加ください。 3/20 参加費無料です!!
前回に続き東京創業ステーションからPythonセミナーの依頼をいただいております。 今回も初学者向けですが演習テーマは前回と変えているので、前回参加された方もぜひまたご参加ください。 3/20 参加費無料です!!
以前も開催してご好評をいただいたPyhon初学者セミナーを再度実施することになりました。
参加ご希望の方は東京創業ステーションのWebサイトよりお申し込みください。
参加にあたり、制限はなくどなたでも参加OKですので、ご気軽にご参加ください。
また、拡散いただければ幸いですm(_ _)m
ご参加お待ちしております(^^♪
前回の続き
今回は、動的にSQLを生成してみようと思います。
これ自体はそんなに難しいものではありません。
DECLARE @SQL NVARCHAR(500) SET @SQL = 'SELECT * FROM Person.Person' EXEC (@SQL)
上記は「SELECT * FROM Person.Person」を実行しているのと同じ結果です。
SQL文字列をEXEC()で実行することができます。
こんなかんじ。
ここまで読んでくれた方、「これ意味あるの!?」とおもいますよね。
およらく、多くは変数の部分を動的に使うから意味があると思うので、紹介します。
例えば、PersonTypeの値を動的に変えてあげる動的SQLを作成しています。
DECLARE @SQL NVARCHAR(500) DECLARE @PARAM NVARCHAR(10) SET @PARAM = '''EM''' SET @SQL = 'SELECT * FROM Person.Person ' SET @SQL += 'WHERE PersonType = ' SET @SQL += @PARAM EXEC (@SQL)
結果はこんな感じ
SQLでは、文字列はシングルクォーテーションでくくるというルールがややこしいですね。
以下のSQLで出力を確認してみるとよくわかると思います。
DECLARE @PARAM NVARCHAR(10) SET @PARAM = '''EM''' PRINT @PARAM
こんなかんじ
実は、シングルクォーテーションは文字列をくくる以外に、エスケープという目的があります。
つまり、「'''」は2つ目のシングルクォーテーションが3つ目のシングルクォーテーションをエスケープしているので、
「 '''EM'''」は、1つ目と最後のシングルクォーテーションにくくられている「'E'」ということになるのです。
以上、今回はここまで。
前回の続き
今回は、外部ファイルを読み込む方法を紹介します。
SQLSeverで外部ファイルを取り込む方法としての王道はBULKINSERTです。
では、さっそくやってみます。
BULK INSERT [テーブル名] FROM 'C:\Users\***\TEST.CSV' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' )
解説します。
BULK INSERT [テーブル名]
取り込むテーブルを指定します。
FROM 'C:\Users\***\TEST.CSV'
取り込むファイルを指定します。
FIELDTERMINATOR = ',',
今回はカンマ区切りのCSVファイルなので、カンマで区切られているということを指定する。
ROWTERMINATOR = '\n'
改行コードを指定します。\nや\r\nなどの場合があるので、テキストエディタなどで確認してみましょう。
WITHのカッコ内でオプションを指定することで、細かい制御が可能です。
このページがよくまとめてあるので、参考になると思います。
以上、BULKINSERTを一時テーブルに入れてあげて、カーソルで回してあげて処理するなんて応用も考えられますね!!
今回はここまで。
前回の続き
今回は、前回お伝え出来なかった日付型の内容の続きを紹介します。
2つの日付間の間隔をとることができます。
以外に結構使うんですよね。
年、月、日、時、分、秒ごとに計測してみます。
DECLARE @DATE01 DATETIME = '2021-01-13 10:10:10.010', @DATE02 DATETIME = '2023-04-01 00:00:00.000'; SELECT DATEDIFF(yy, @DATE01, @DATE02) AS yy, DATEDIFF(mm, @DATE01, @DATE02) AS mm, DATEDIFF(dd, @DATE01, @DATE02) AS dd, DATEDIFF(hh, @DATE01, @DATE02) AS hh, DATEDIFF(mi, @DATE01, @DATE02) AS mi, DATEDIFF(ss, @DATE01, @DATE02) AS ss
こんなかんじです。
データが、DATE型なのかを確認します。
さまざまな形式を確かめてみましょう。
DECLARE @DATE01 VARCHAR(30) = '2021-01-13', @DATE02 VARCHAR(30) = '01-13-2021', @DATE03 VARCHAR(30) = '2021-01-13 00:00:00:000', @DATE04 VARCHAR(30) = 123456, @DATE05 VARCHAR(30) = '123456'; SELECT ISDATE(@DATE01) AS '2021-01-13', ISDATE(@DATE02) AS '01-13-2021', ISDATE(@DATE03) AS '2021-01-13 00:00:00:000', ISDATE(@DATE04) AS _INT, ISDATE(@DATE05) AS _CHR
こんなかんじです。
文字型を日付型として扱うときにはISDATEで確認してから、DATEADDとかDATEDIFFとかやればエラーなく行けそうですね。
今回は、日付型の扱い方を紹介していきます。
CONVERT関数は、データ型の変更を行ってくれます。
例えばこんな感じ。
SELECT GETDATE(), CONVERT(NVARCHAR, GETDATE())
GETDATE()は、現時点の日時を取得してくれるもので、CONVERT(NVARCHAR, GETDATE())は、現在日時を文字型に変換したということになります。
年月日は国ごとに表記法が異なります。
そこで、CONVERT関数の第3引数に指定することによって制御可能です。
例えばこんな感じ
DECLARE @Date DATETIME = GETDATE(); SELECT CONVERT(NVARCHAR, @Date, 101) AS '米国4桁', CONVERT(NVARCHAR, @Date, 1) AS '米国2桁', CONVERT(NVARCHAR, @Date, 111) AS '日本4桁', CONVERT(NVARCHAR, @Date, 11) AS '日本2桁'
他の国など詳しくは以下を見てみよう。
基準となる日から、日にちや時間をずらすことも可能だ。
例えば、本日から日にちをずらしてみる。
DECLARE @Today DATETIME = GETDATE() DECLARE @Day_01 DATETIME = dateadd(DAY,1,GETDATE()) DECLARE @Week_01 DATETIME = dateadd(WEEK,-1,GETDATE()) DECLARE @Month_01 DATETIME = dateadd(MONTH,1,GETDATE()) DECLARE @Quarter_01 DATETIME = dateadd(QUARTER,-1,GETDATE()) DECLARE @Year_01 DATETIME = dateadd(YEAR,10,GETDATE()) SELECT CONVERT(NVARCHAR, @Today, 111) AS '本日', CONVERT(NVARCHAR, @Day_01, 111) AS '1日後', CONVERT(NVARCHAR, @WEEK_01, 111) AS '1週前', CONVERT(NVARCHAR, @Month_01, 111) AS '1月後', CONVERT(NVARCHAR, @Quarter_01, 111) AS '3月前', CONVERT(NVARCHAR, @Year_10, 111) AS '10年後'
時間もこの通り
DECLARE @Today DATETIME = GETDATE() DECLARE @Hour_01 DATETIME = dateadd(HOUR,1,GETDATE()) DECLARE @Minutie_01 DATETIME = dateadd(MINUTE,-1,GETDATE()) DECLARE @Second_01 DATETIME = dateadd(SECOND,1,GETDATE()) SELECT @Today AS '現在', @Hour_01 AS '1時間後', @Minutie_01 AS '1分前', @Second_01 AS '1秒後'
以上今回はここまで。
今回はUNIONを紹介します。
簡単に言うと、行結合です。
2つのテーブルを行方向に結合してあげるためにUNIONを使います。
ためしに、Person.PersonテーブルのLastNameを結合してみます。
ただし、WHERE句でPersonTypeを抽出条件として指定しています。
SELECT LastName FROM Person.Person WHERE PersonType = 'EM' UNION SELECT LastName FROM Person.Person WHERE PersonType = 'IN'
570件のデータが確認されます。
実は、UNION とだけ指定すると、重複する行は削除されてユニークな値のみが出力されるのです。
では、重複削除を行わず単純にテーブルを行結合するにはどうすればよいかというと、UNIONのあとにALLを付けます。
こんなかんじです。
SELECT LastName FROM Person.Person WHERE PersonType = 'EM' UNION ALL SELECT LastName FROM Person.Person WHERE PersonType = 'IN'
18757件と結果が全然違います。
テーブル同士を行結合するのですから、カラム数は一致していなくてはなりません。 例えばこれはエラーになります。
SELECT LastName FROM Person.Person WHERE PersonType = 'EM' UNION ALL SELECT LastName,FirstName FROM Person.Person WHERE PersonType = 'IN'
こんなかんじです。
データ型の違いもダメです。
SELECT LastName FROM Person.Person WHERE PersonType = 'EM' UNION ALL SELECT BusinessEntityID FROM Person.Person WHERE PersonType = 'IN'
エラーになります。
以上、今回はここまで。