Archive for 5月 2015
SQL Serverで縦のものを横にする
できたらいいなと思ってやってみたらできてしまった(笑)のでメモ
データベースで親子関係のある2つのテーブルがあったとする。
ID | 値 |
1 | ふー |
2 | ばー |
ID | 親のID | 値 |
1 | 1 | ほげ |
2 | 1 | ふが |
3 | 2 | ぴよ |
これを結合してこんな風に表示したいときがある
親の値 | 子の値1 | 子の値2 |
ふー | ほげ | ふが |
ばー | ぴよ |
こういう需要は割とあるようで、質問サイトでもときどき見かける。
回答はだいたい「親子を別に取得してプログラムで並べろ」ってなるんだけど、
ピボットテーブルを使ってSQLだけで取得できないか?と考えてやってみた。
で、できたSQLがこれ
— テスト用のテーブル DECLARE @Parent TABLE([ID] INT, [値] NVARCHAR(100)); DECLARE @Child TABLE([ID] INT, [親のID] INT, [値] NVARCHAR(100)); INSERT INTO @Parent VALUES (1, N’ふー’), (2, N’ばー’); — ここから取得用SQL |
これがどうなっているかというと、
まず、対象データをテーブル変数で作成
DECLARE @Parent TABLE([ID] INT, [値] NVARCHAR(100)); DECLARE @Child TABLE([ID] INT, [親のID] INT, [値] NVARCHAR(100)); INSERT INTO @Parent VALUES (1, N’ふー’), (2, N’ばー’); |
対象データを結合、その際に子のレコードに対して親ごとに連番を振る。
これを共通テーブル式にする。
WITH [TargetSource] AS ( SELECT p.[ID] AS [ID] ,p.[値] AS [親の値] ,c.[値] AS [子の値] ,ROW_NUMBER() OVER (PARTITION BY p.[ID] ORDER BY c.[ID]) AS [Seq] ←親ごとの連番 FROM @Parent p LEFT OUTER JOIN @Child c ON p.[ID] = c.[親のID] ) |
振られた連番をもとにピボットテーブルを作成する。
今回取得するデータは文字列型なので、ピボットテーブルで使用できる集計関数はMIN()とMAX()だけ。
集計関数はダミーなので、どっちにしろMIN()かMAX()しか使わないと思う(どっちを使っても結果は同じ)
SELECT [親の値] ,[1] AS [子の値1] ,[2] AS [子の値2] FROM ( SELECT [ID], [親の値], [子の値], [Seq] FROM [TargetSource]) src PIVOT (MAX([子の値]) FOR [Seq] IN ([1], [2])) pvt ORDER BY [ID] |
あらかじめ取得するフィールドの数がわかってないとこの方法は使えないのが難点。
わからない場合は一旦フィールド数を取ってきてからSQLを動的に作成するか、上にも書いたように
親子のレコードを別々に取得して出力時に並べるかしないとダメ。
と、いうわけで、余程のことがない限り無理して使う必要はないというwwww
あ、言い忘れてたけど、これはピボットテーブルの「正しい」使用法ではないのでご注意
妻恋坂
アキバの北あたりに妻恋坂っていう坂がある。
この間そこを通った時に
「きっとここで年に一回奥さんに愛してると言ってみるイベントが開かれているに違いない!」
などと訳の分からないことを思いつき、家に帰って早速調べてみた。
そんなイベントはなかったよ...
つまらん
Windows10のMSゴシック
デザイン界隈で大変評判の悪いMSゴシック
ふと気になって調べてみたら、Windows10でも何も変わりはなかった。
8.1と比べてバージョンもファイルハッシュも同じ、つまり完全に一致。
悪名高いビットマップデータもそのまま。
つまり、Windows10になってもClearTypeの恩恵にはあずかれない
10年以上前から言われ続けてるのに、このMSKKの仕事っぷりときたら(笑)
なお、Build10074での比較結果なので、今後どうなるかはわかりません。
ま、どうにもならないだろうけどね。
MSDN Professional更新
結局この前買ったところ(SEshop.com)が一番安かったので今回もそこで。
7月にWindows 10と同時にVisual Studio 2015のRTMがたぶん出るんで、
その時にライセンス体系が変わって安くなったりして俺涙目になるんだろうな...
※UltimateとPremiumが統合されてEnterpriseっていう新しいのになってPremiumの価格になるっていうのは
決定事項らしい
http://blogs.msdn.com/b/visualstudio/archive/2015/03/31/announcing-the-visual-studio-2015-product-line.aspx