愚者の経験

「また今度」はほとんどこない

月別アーカイブ: 11月 2014

[SQL Server][SQL][Tips]pivotを使ってAccessのクロス集計クエリっぽいことをする1

Accessでいうところの「クロス集計クエリ」ですがSQL Serverだと「pivot」で実現は可能です。
書き方覚えられないので毎回ネットで調べてますが(笑)

テーブル用意
pivott

	select Y.*
		,(select top 1 A.売上先名称 from dbo.mtbl_売上先 as A where A.売上先ID=Y.売上先ID) as 売上先名称
	from (
		select A.売上先ID,B.商品名称,sum(A.金額) as 金額計
		from dbo.tbl_売上明細 as A
			inner join dbo.mtbl_商品 as B on B.商品ID=A.商品ID
			left join dbo.mtbl_商品分類 as C on C.分類ID=B.分類ID
		group by A.売上先ID,C.分類名称,B.商品名称
	) as X
	pivot (
		max(X.金額計) for X.商品名称 in 
			(みかん,りんご,トマト,きゅうり)
	) as Y

pivotを使う際、直前のselectで必要項目を絞ってなくてもgroup byの様に怒られないです(笑)
ですがその代わりに集計もしてくれません…ちゃんと指定しましょう。

	select Y.売上先ID,Y.きゅうり,Y.みかん,Y.りんご,Y.トマト
		,(select top 1 A.売上先名称 from dbo.mtbl_売上先 as A where A.売上先ID=Y.売上先ID) as 売上先名称
	from (
		select A.売上先ID,B.商品名称,sum(A.金額) as 金額計,sum(A.個数) as 個数計
		from dbo.tbl_売上明細 as A
			inner join dbo.mtbl_商品 as B on B.商品ID=A.商品ID
			left join dbo.mtbl_商品分類 as C on C.分類ID=B.分類ID
		group by A.売上先ID,C.分類名称,B.商品名称
	) as X
	pivot (
		max(X.金額計) for X.商品名称 in 
			(みかん,りんご,トマト,きゅうり)
	) as Y

pivotの中を『sum(金額) for 商品名称 in (みかん,りんご,トマト,きゅうり)』みたいに書いたほうが見た目
わかりやすいと思うかもしれませんが、私の頭がついていけないので行をまとめてからpivotすると決めています笑

広告

[YAMAHA]RTX1200の後継っていつの間にか出てました「RTX1210」