- PR -

SQLで月別集計のやり方。

1
投稿者投稿内容
まいどん
会議室デビュー日: 2007/03/28
投稿数: 13
投稿日時: 2007-03-28 10:28
現在仕事で月別の集計表をASP.NET + C#で実現させたいのですが、
月別に集計させるSQLが思いつきません。
環境は
SQLServer2005 VS2005

やりたい事は
部門別にその年度の月別金額を集計です。
検索年度を入力してその対象年度の各月の金額を集計したいのです。
(本当は4月〜3月まであります)

年度2006年度
部門コード|部門名|4月|5月|6月|7月|8月|9月|合計
10     部門10 100 50 0 0 200 0 350 
11 部門11 200 300 400 0 0 0 900
    合計 300 350 400 0 200 0 1250

とこんな感じで出力させたいです。

DBでのデータの持ち方は
部門コード|売上年月日|金額|
10 20060301 100
10 20060402 50
10 20060405 50
11 20060405 200
10 20060520 50
      
という感じで持っています。
Group byに売上年月日を入れないとなのですが、
それを入れてしまうと月が変わると別レコードで取得されていまいます。
また年月日を入れないで部門コードだけでGroup byすると今度は月別ではなく同一部門であれば月に関係なく全てが加算されてしまいます。

自分も含めてSQLに強いメンバーがおらずここで足踏み状態です。
何かよい知恵がありましたら教えて下さい。


さる
ぬし
会議室デビュー日: 2005/07/14
投稿数: 276
お住まい・勤務地: 実家戻ったw
投稿日時: 2007-03-28 10:50
引用:

Group byに売上年月日を入れないとなのですが、
それを入れてしまうと月が変わると別レコードで取得されていまいます。



別レコードになったら何がいけないの?
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2007-03-28 11:00
データ型が不明ですが、売上年月日が文字だとすると、例えば以下のようなSQLが考えられます。

コード:
select
 部門コード,
 sum(case substr(売上年月日,5,2) when '04' then 金額 else 0 end) as "4月"
 sum(case substr(売上年月日,5,2) when '05' then 金額 else 0 end) as "5月"
 〜中略〜
 sum(case substr(売上年月日,5,2) when '03' then 金額 else 0 end) as "3月"
from 表名
where substr(売上年月日,1,6) between '200604' and '200703'
group by 部門コード



実機確認はしておらず、性能を重視した記述ではないので、その点は注意してください。
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2007-03-28 11:19
失礼。SQL Serverは、substrでなくsubstringでした。
またselectの選択列の並びで、カンマが抜けていたので訂正します。

コード:
select
 部門コード,
 sum(case substring(売上年月日,5,2) when '04' then 金額 else 0 end) as "4月",
 sum(case substring(売上年月日,5,2) when '05' then 金額 else 0 end) as "5月",
 sum(case substring(売上年月日,5,2) when '06' then 金額 else 0 end) as "6月",
 sum(case substring(売上年月日,5,2) when '07' then 金額 else 0 end) as "7月",
 sum(case substring(売上年月日,5,2) when '08' then 金額 else 0 end) as "8月",
 sum(case substring(売上年月日,5,2) when '09' then 金額 else 0 end) as "9月",
 sum(case substring(売上年月日,5,2) when '10' then 金額 else 0 end) as "10月",
 sum(case substring(売上年月日,5,2) when '11' then 金額 else 0 end) as "11月",
 sum(case substring(売上年月日,5,2) when '12' then 金額 else 0 end) as "12月",
 sum(case substring(売上年月日,5,2) when '01' then 金額 else 0 end) as "1月",
 sum(case substring(売上年月日,5,2) when '02' then 金額 else 0 end) as "2月",
 sum(case substring(売上年月日,5,2) when '03' then 金額 else 0 end) as "3月"
from t1
where substring(売上年月日,1,6) between '200604' and '200703'
group by 部門コード

まいどん
会議室デビュー日: 2007/03/28
投稿数: 13
投稿日時: 2007-03-28 20:34
>>さるさん

部門毎に各月で集計をかけ、それを1行で表示をさせたいので
月が変わると別レコードで取れてしまうとプログラムで部門別に集計をかけないといけなくなってしまうので、SQLで1レコードとしてとれた方が処理スピードとしても一番BESTな方法かなと思いましたので、このようなやり方で取りたいのです。

>>忠犬さん
出来ました。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)