VB6 SP5 SQLSEVER2000
SQLの作り方についての質問です。
年月、担当者毎の売上金額を、例えば売上ファイルから抽出するとします。
画面から年月を入力して、それから18ヶ月以前のデータを抽出して、
データが無い月は金額を0にします。
抽出結果は、
年月 担当者 金額
200401 1 10
200404 1 20
200405 1 30
200312 2 10
200401 2 20
200405 2 30
になるとします。
これを、担当者を縦にして、横に18ヶ月分だけ並べたい場合は
どのようにすればいいのでしょうか?
UNION、JOINを18書く?
SUM(CASE WHEN 年月 = 200404 THEN 金額 ELSE 0 END)
みたいなのを18個書く?
何か簡単な方法は無いのでしょうか?
クロス集計クエリにしては?
TRANSFORM Sum(テーブル1.金額) AS 金額
SELECT テーブル1.担当者
FROM テーブル1
GROUP BY テーブル1.担当者
PIVOT テーブル1.年月;
みたいな。
すみません。
上記のSQLは、クエリアナライザで記述するものなのでしょうか?
TRANSFORM,PIVOTを書いても強調表示にならないので疑問に思いました。
SQLServerでしたね。失礼。
Accessにリンクして、Access上で上記クエリを発行するか、
T-SQLでやる場合、当方,テスト環境がありませんので
http://www7.big.or.jp/~pinball/index.html
の過去ログ検索で、検索対象「SQL-Server会議室」で
「クロス集計」をキーワード検索してみてください。
また、
http://www.microsoft.com/japan/technet/prodtechnol/sql/books/sqlmitgd.asp
にも参考資料があります。
例えば・・・
WorkDate DateTime
Worker int
Amount int
のテーブル構造としてテストデータを登録し・・・
テーブル名は、TESTとします。
力技のSQLですが・・・
SELECT
Worker,
Q0,Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8,Q9,Q10,Q11,Q12,Q13,Q14,Q15,Q16,Q17,Q18
FROM
(
SELECT
Worker,
SUM(CASE convert(datetime,str(datepart(yyyy,P.WorkDate))+'/'+str(datepart(mm,P.WorkDate))+'/01') WHEN convert(datetime,str(datepart(yyyy,DateAdd(mm,0,GETDATE())))+'/'+str(datepart(mm,DateAdd(mm,0,GETDATE())))+'/01') THEN P.Money ELSE 0 END) AS Q0,
SUM(CASE convert(datetime,str(datepart(yyyy,P.WorkDate))+'/'+str(datepart(mm,P.WorkDate))+'/01') WHEN convert(datetime,str(datepart(yyyy,DateAdd(mm,-1,GETDATE())))+'/'+str(datepart(mm,DateAdd(mm,-1,GETDATE())))+'/01') THEN P.Money ELSE 0 END) AS Q1,
SUM(CASE convert(datetime,str(datepart(yyyy,P.WorkDate))+'/'+str(datepart(mm,P.WorkDate))+'/01') WHEN convert(datetime,str(datepart(yyyy,DateAdd(mm,-2,GETDATE())))+'/'+str(datepart(mm,DateAdd(mm,-2,GETDATE())))+'/01') THEN P.Money ELSE 0 END) AS Q2,
SUM(CASE convert(datetime,str(datepart(yyyy,P.WorkDate))+'/'+str(datepart(mm,P.WorkDate))+'/01') WHEN convert(datetime,str(datepart(yyyy,DateAdd(mm,-3,GETDATE())))+'/'+str(datepart(mm,DateAdd(mm,-3,GETDATE())))+'/01') THEN P.Money ELSE 0 END) AS Q3,
SUM(CASE convert(datetime,str(datepart(yyyy,P.WorkDate))+'/'+str(datepart(mm,P.WorkDate))+'/01') WHEN convert(datetime,str(datepart(yyyy,DateAdd(mm,-4,GETDATE())))+'/'+str(datepart(mm,DateAdd(mm,-4,GETDATE())))+'/01') THEN P.Money ELSE 0 END) AS Q4,
SUM(CASE convert(datetime,str(datepart(yyyy,P.WorkDate))+'/'+str(datepart(mm,P.WorkDate))+'/01') WHEN convert(datetime,str(datepart(yyyy,DateAdd(mm,-5,GETDATE())))+'/'+str(datepart(mm,DateAdd(mm,-5,GETDATE())))+'/01') THEN P.Money ELSE 0 END) AS Q5,
SUM(CASE convert(datetime,str(datepart(yyyy,P.WorkDate))+'/'+str(datepart(mm,P.WorkDate))+'/01') WHEN convert(datetime,str(datepart(yyyy,DateAdd(mm,-6,GETDATE())))+'/'+str(datepart(mm,DateAdd(mm,-6,GETDATE())))+'/01') THEN P.Money ELSE 0 END) AS Q6,
SUM(CASE convert(datetime,str(datepart(yyyy,P.WorkDate))+'/'+str(datepart(mm,P.WorkDate))+'/01') WHEN convert(datetime,str(datepart(yyyy,DateAdd(mm,-7,GETDATE())))+'/'+str(datepart(mm,DateAdd(mm,-7,GETDATE())))+'/01') THEN P.Money ELSE 0 END) AS Q7,
SUM(CASE convert(datetime,str(datepart(yyyy,P.WorkDate))+'/'+str(datepart(mm,P.WorkDate))+'/01') WHEN convert(datetime,str(datepart(yyyy,DateAdd(mm,-8,GETDATE())))+'/'+str(datepart(mm,DateAdd(mm,-8,GETDATE())))+'/01') THEN P.Money ELSE 0 END) AS Q8,
SUM(CASE convert(datetime,str(datepart(yyyy,P.WorkDate))+'/'+str(datepart(mm,P.WorkDate))+'/01') WHEN convert(datetime,str(datepart(yyyy,DateAdd(mm,-9,GETDATE())))+'/'+str(datepart(mm,DateAdd(mm,-9,GETDATE())))+'/01') THEN P.Money ELSE 0 END) AS Q9,
SUM(CASE convert(datetime,str(datepart(yyyy,P.WorkDate))+'/'+str(datepart(mm,P.WorkDate))+'/01') WHEN convert(datetime,str(datepart(yyyy,DateAdd(mm,-10,GETDATE())))+'/'+str(datepart(mm,DateAdd(mm,-10,GETDATE())))+'/01') THEN P.Money ELSE 0 END) AS Q10,
SUM(CASE convert(datetime,str(datepart(yyyy,P.WorkDate))+'/'+str(datepart(mm,P.WorkDate))+'/01') WHEN convert(datetime,str(datepart(yyyy,DateAdd(mm,-11,GETDATE())))+'/'+str(datepart(mm,DateAdd(mm,-11,GETDATE())))+'/01') THEN P.Money ELSE 0 END) AS Q11,
SUM(CASE convert(datetime,str(datepart(yyyy,P.WorkDate))+'/'+str(datepart(mm,P.WorkDate))+'/01') WHEN convert(datetime,str(datepart(yyyy,DateAdd(mm,-12,GETDATE())))+'/'+str(datepart(mm,DateAdd(mm,-12,GETDATE())))+'/01') THEN P.Money ELSE 0 END) AS Q12,
SUM(CASE convert(datetime,str(datepart(yyyy,P.WorkDate))+'/'+str(datepart(mm,P.WorkDate))+'/01') WHEN convert(datetime,str(datepart(yyyy,DateAdd(mm,-13,GETDATE())))+'/'+str(datepart(mm,DateAdd(mm,-13,GETDATE())))+'/01') THEN P.Money ELSE 0 END) AS Q13,
SUM(CASE convert(datetime,str(datepart(yyyy,P.WorkDate))+'/'+str(datepart(mm,P.WorkDate))+'/01') WHEN convert(datetime,str(datepart(yyyy,DateAdd(mm,-14,GETDATE())))+'/'+str(datepart(mm,DateAdd(mm,-14,GETDATE())))+'/01') THEN P.Money ELSE 0 END) AS Q14,
SUM(CASE convert(datetime,str(datepart(yyyy,P.WorkDate))+'/'+str(datepart(mm,P.WorkDate))+'/01') WHEN convert(datetime,str(datepart(yyyy,DateAdd(mm,-15,GETDATE())))+'/'+str(datepart(mm,DateAdd(mm,-15,GETDATE())))+'/01') THEN P.Money ELSE 0 END) AS Q15,
SUM(CASE convert(datetime,str(datepart(yyyy,P.WorkDate))+'/'+str(datepart(mm,P.WorkDate))+'/01') WHEN convert(datetime,str(datepart(yyyy,DateAdd(mm,-16,GETDATE())))+'/'+str(datepart(mm,DateAdd(mm,-16,GETDATE())))+'/01') THEN P.Money ELSE 0 END) AS Q16,
SUM(CASE convert(datetime,str(datepart(yyyy,P.WorkDate))+'/'+str(datepart(mm,P.WorkDate))+'/01') WHEN convert(datetime,str(datepart(yyyy,DateAdd(mm,-17,GETDATE())))+'/'+str(datepart(mm,DateAdd(mm,-17,GETDATE())))+'/01') THEN P.Money ELSE 0 END) AS Q17,
SUM(CASE convert(datetime,str(datepart(yyyy,P.WorkDate))+'/'+str(datepart(mm,P.WorkDate))+'/01') WHEN convert(datetime,str(datepart(yyyy,DateAdd(mm,-18,GETDATE())))+'/'+str(datepart(mm,DateAdd(mm,-18,GETDATE())))+'/01') THEN P.Money ELSE 0 END) AS Q18
FROM
TEST AS P
GROUP BY
P.Worker
) AS P1
で、得られます。
SQL Server 2000 なら、ストアドプロシージャとか、ビューとかを
駆使した方が、キレイにできますが・・・
まぁ〜できると言うことで・・・
※ どっか、間違っていますかネ〜
以上。
ありがとうございます。
どうしてもSQLSEVERでしたいので、
力技で行こうかと思います。
皆さんありがとうございました。