• ベストアンサー

SQLを教えて下さい

SQL server 2008 R2 と VB2010 で開発を行っています。 いま、月別の合計金額を計算するSQLがわからなくて困っています。 【売上明細テーブル】 ・明細ID ・年月日 ・得意先ID ・売上金額 出力したい内容は以下のような月別売上合計の推移です。 具体的にはこんな感じです。 得意先ID 3月売上 4月売上 5月売上 --------------------------------------- 0001     1,111   2,222   3,333 0002     2,222   3,333   4,444 0003     5,555     0    6,666 得意先の中には売上の無い月もあります(0003の4月)が、 この場合も一覧に出したいと考えています。 1つのロウの中に異なる条件の値がある場合のSQLの組み立てがわかりません。 どうぞ宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

SELECT 得意先ID, SUM( CASE MONTH(年月日) WHEN 1 THEN 売上金額 ELSE 0 END ) AS 1月売上, SUM( CASE MONTH(年月日) WHEN 2 THEN 売上金額 ELSE 0 END ) AS 2月売上, SUM( CASE MONTH(年月日) WHEN 3 THEN 売上金額 ELSE 0 END ) AS 3月売上, SUM( CASE MONTH(年月日) WHEN 4 THEN 売上金額 ELSE 0 END ) AS 4月売上, SUM( CASE MONTH(年月日) WHEN 5 THEN 売上金額 ELSE 0 END ) AS 5月売上, SUM( CASE MONTH(年月日) WHEN 6 THEN 売上金額 ELSE 0 END ) AS 6月売上, SUM( CASE MONTH(年月日) WHEN 7 THEN 売上金額 ELSE 0 END ) AS 7月売上, SUM( CASE MONTH(年月日) WHEN 8 THEN 売上金額 ELSE 0 END ) AS 8月売上, SUM( CASE MONTH(年月日) WHEN 9 THEN 売上金額 ELSE 0 END ) AS 9月売上, SUM( CASE MONTH(年月日) WHEN 10 THEN 売上金額 ELSE 0 END ) AS 10月売上, SUM( CASE MONTH(年月日) WHEN 11 THEN 売上金額 ELSE 0 END ) AS 11月売上, SUM( CASE MONTH(年月日) WHEN 12 THEN 売上金額 ELSE 0 END ) AS 12月売上 FROM 売上明細テーブル GROUP BY 得意先ID 年月日DADETIME型であることを想定しています。 年月日が複数年に渡る場合はWHERE条件で絞り込んでください。 売上金額をSQLでカンマ区切り書式の文字列にしたい時はCONVERTを活用します。 http://www.ilovex.co.jp/Division/SRD/archives/2007/08/convert_1.html

panasobi
質問者

お礼

nora1962さん、ありがとうございました。 それと、返信が大変遅れてしまったことをお詫び致します。 教えて頂いた case~when でいろいろやってみて解決しました。 最初はよく理解できなくて、いろいろやり方を変えて行くうちに時間がたってしまし、 本当に申し訳ありませんでした。

すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.2

SQL Server 2005より前なら、#1さんの回答のように 「case式で振り分けて・・・」といった方法でクロス集計を実装することが多いです。 SQL Server 2005からは、独自機能の pivotを使う方法があります。 例えば、次のようなSQLになります。 select 得意先ID ,[3] as "3月売上" ,[4] as "4月売上" ,[5] as "5月売上" from ( select 得意先ID ,month(年月日) as 月 ,売上金額 from 売上明細テーブル ) as p pivot ( sum(売上金額) for 月 in ([3],[4],[5]) ) as pvt order by pvt.得意先ID ;

参考URL:
http://msdn.microsoft.com/ja-jp/library/ms177410.aspx
panasobi
質問者

お礼

chukenkenkouさん、ありがとうございました。 それと、返信が大変遅れてしまったことをお詫び致します。 当初の問題はcase~whenを使ってナントカ解決しました。 教えて頂いたpivotはチョッと敷居が高いですが、今後はもっと勉強して取り組みたいと考えています。 お礼が遅くなって、本当に申し訳ありませんでした。

すると、全ての回答が全文表示されます。

関連するQ&A