- PR -

月別集計方法について

1
投稿者投稿内容
みーちく
大ベテラン
会議室デビュー日: 2002/08/29
投稿数: 131
投稿日時: 2005-12-20 10:26
みーちくと申します。
宜しくお願いいたします。

SQLServer8.0において、過去1年分の日付の集計結果を取得したいのですが、
うまくSQLが書けません。下記のSQLの他にうまい方法などありましたら、
ご教授願います。
宜しくお願い致します。

コード:
Select 
    SUM(CASE WHEN 
        DATEPART(year, SalesDate) = 2005 AND
        DATEPART(month, SalesDate) = 1
        THEN 1 ELSE 0 END
    ) "2005年1月",
    SUM(CASE WHEN 
        DATEPART(year, SalesDate) = 2005 AND
        DATEPART(month, SalesDate) = 2
        THEN 1 ELSE 0 END
    ) "2005年2月",
  :
  :
  :
  12ヶ月続く

今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-12-20 10:35
SQLServer8をやったことないですが、
考え方として

(1)過去1年分のデータをWhere句で指定して取得する。
  取得するデータは年月と、集計したい項目
  ( Select 年月、集計対象項目 From テーブル Where 日付 Between 現在日付-1年 and 現在日付 など)

(2) (1)で取得したデータを年月でGroup Byし、集計対象項目のSumを取得する。
  
まとめると こんな感じになると思うんですが・・・。
こんな感じのSQLでやってみてはいかがでしょう?
コード:
Select 年月、sum(集計対象項目)
from 
  ( Select 年月、集計対象項目 From テーブル Where 日付 Between 現在日付-1年 and 現在日付 ) Temp
Group by 年月

でっち6号
大ベテラン
会議室デビュー日: 2005/01/31
投稿数: 176
お住まい・勤務地: Kawasaki
投稿日時: 2005-12-20 10:46
こんにちは、でっちです。

横並びじゃないといけないんですかね?
縦並びでもよければ、夏椰さんのやり方が簡単ですね。
単純にCount(*)するだけのようですので、Fromの副問合せじゃなくて
Whereで指定した方がより簡単だと思いますが。

データ上月の抜けがある可能性はあるが、取得時には0にしたいとか
そういった前提があるなら工夫が必要になりますが。
みーちく
大ベテラン
会議室デビュー日: 2002/08/29
投稿数: 131
投稿日時: 2005-12-20 11:18
夏椰さん、でっち6号さん

返信ありがとうございます。
私の説明が十分ではなかったのですが、
でっち6号さんのおっしゃる通り、
「データ上月の抜けがある可能性はあるが、取得時には0にしたい」
という条件がありました。
また、対象月(2005/12/20)より、過去1年分のデータを取得したいと
考えております。
私のやり方でも、取得は可能なのですが、SQL文が長くなるだけなので、
うまく取得できないかなと思っております。
また、下記の方法も考えてはみたのですが・・・。
コード:
Select 
    A.AreaCode,
    A.AreaName,
    A.StoreCode,
    A.StoreName,
    SUM(CASE WHEN 
        LEFT(CONVERT(varchar, SalesDate, 112), 6) = LEFT(CONVERT(varchar, DATEADD(MONTH, -12, '20051220'), 112), 6)
        THEN 1 ELSE 0 END
    ) "12",
    SUM(CASE WHEN 
        LEFT(CONVERT(varchar, SalesDate, 112), 6) = LEFT(CONVERT(varchar, DATEADD(MONTH, -11, '20051220'), 112), 6)
        THEN 1 ELSE 0 END
    ) "11",

みーちく
大ベテラン
会議室デビュー日: 2002/08/29
投稿数: 131
投稿日時: 2005-12-20 11:21
みーちくです。
変なコードが出力されてしまいました。
正確にはこちらのコードです。

コード:
Select 
    SUM(CASE WHEN 
        LEFT(CONVERT(varchar, SalesDate, 112), 6) = LEFT(CONVERT(varchar, DATEADD(MONTH, -12, '20051220'), 112), 6)
        THEN 1 ELSE 0 END
    ) "12",
    SUM(CASE WHEN 
        LEFT(CONVERT(varchar, SalesDate, 112), 6) = LEFT(CONVERT(varchar, DATEADD(MONTH, -11, '20051220'), 112), 6)
        THEN 1 ELSE 0 END
    ) "11",
  :
  :
  :
  12ヶ月続く

今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-12-20 15:15
勧めていいのかわからないですが・・・

以下のSQLで前年+年月が取得できます。
(MSDE2000で確認したので、SQLServer8で出来るかはわかりません。)

コード:

select cast(year(getdate())-1 as varchar) + '/' + case when colid < 10 then "0" else "" end + cast(colid as varchar) as ym
from
( select distinct colid from syscolumns where colid between 1 and 12 ) temp
order by ym
;


コード:

ym
--------------------
2004/01
2004/02
2004/03
2004/04
2004/05
2004/06
2004/07
2004/08
2004/09
2004/10
2004/11
2004/12

(12 件処理されました)



この表を元に対象テーブルをOuter Joinして集計するってどうでしょう?

上記のSQLでは1からの連番がほしかったのでsyscolumnsテーブルのcolidを
使ったのですが、別に業務テーブルなどで
連番を保持しているテーブルがあるのであればその方がいいかと思います。

それ以外の方法となると・・・オレの頭ではがんばって12個書くしか思いつきませんでした。

[ メッセージ編集済み 編集者: 夏椰 編集日時 2005-12-20 15:15 ]
みーちく
大ベテラン
会議室デビュー日: 2002/08/29
投稿数: 131
投稿日時: 2005-12-20 15:33
夏椰さん

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

私のマシンは、クライアントが入っていないので、
CommonSQLを使用してクエリを作成しています。
システムテーブルの存在をすっかり、忘れておりました。
いろいろなやり方があるのですね。
参考になりました。

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

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