アプリ版:「スタンプのみでお礼する」機能のリリースについて

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の組み立てがわかりません。

どうぞ宜しくお願いします。

A 回答 (2件)

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/20 …
    • good
    • 0
この回答へのお礼

nora1962さん、ありがとうございました。
それと、返信が大変遅れてしまったことをお詫び致します。

教えて頂いた case~when でいろいろやってみて解決しました。
最初はよく理解できなくて、いろいろやり方を変えて行くうちに時間がたってしまし、
本当に申し訳ありませんでした。

お礼日時:2011/06/26 11:23

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 …
    • good
    • 0
この回答へのお礼

chukenkenkouさん、ありがとうございました。
それと、返信が大変遅れてしまったことをお詫び致します。

当初の問題はcase~whenを使ってナントカ解決しました。
教えて頂いたpivotはチョッと敷居が高いですが、今後はもっと勉強して取り組みたいと考えています。

お礼が遅くなって、本当に申し訳ありませんでした。

お礼日時:2011/06/26 11:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!