SQLについて

解決


へなちょこ  2004-05-19 10:55:22  No: 83422  IP: [192.*.*.*]

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個書く?
何か簡単な方法は無いのでしょうか?

編集 削除
Say  2004-05-19 16:18:28  No: 83423  IP: [192.*.*.*]

クロス集計クエリにしては?

TRANSFORM Sum(テーブル1.金額) AS 金額
SELECT テーブル1.担当者
FROM テーブル1
GROUP BY テーブル1.担当者
PIVOT テーブル1.年月;

みたいな。

編集 削除
へなちょこ  2004-05-19 17:01:20  No: 83424  IP: [192.*.*.*]

すみません。
上記のSQLは、クエリアナライザで記述するものなのでしょうか?
TRANSFORM,PIVOTを書いても強調表示にならないので疑問に思いました。

編集 削除
Say  2004-05-19 21:10:58  No: 83425  IP: [192.*.*.*]

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
にも参考資料があります。

編集 削除
岡田 之仁  2004-05-19 21:18:43  No: 83426  IP: [192.*.*.*]

例えば・・・
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 なら、ストアドプロシージャとか、ビューとかを
駆使した方が、キレイにできますが・・・

まぁ〜できると言うことで・・・

※  どっか、間違っていますかネ〜

以上。

編集 削除
へなちょこ  2004-05-20 09:40:59  No: 83427  IP: [192.*.*.*]

ありがとうございます。
どうしてもSQLSEVERでしたいので、
力技で行こうかと思います。
皆さんありがとうございました。

編集 削除