- PR -

日付データ列を年月でグループ化(オラクル)

1
投稿者投稿内容
ふらわー
常連さん
会議室デビュー日: 2008/01/11
投稿数: 33
投稿日時: 2008-02-18 15:01
オラクルを使用して開発している初心者です。
色々調べたり考えたりしたのですが、どうしてもわからなかったので質問させていただきました。

実現したいことは、あるテーブルの列にある日付データ(例:2008/01/01のように年月日が入っています)を年月で絞り込んでグループ化して(コード1とコード2と年月でグループ化)ビューにデータを入れたいと思っています。

TABLE1は下記のような定義です。
[コード1][コード2][売上][日付]

データは
01,001,10000,2008/01/01
01,001,20000,2008/01/15
01,001,30000,2008/01/30
02,001,10000,2008/01/05
02,001,10000,2008/01/31
03,001,50000,2008/02/01
03,001,50000,2008/02/24

のようにあるとします。

これをビューに
[コード1][コード2][売上][年月]
01,001, 50000,2008/01
02,001, 20000,2008/01
03,001,100000,2008/02

このようにデータを入れたいと思っております。

考えた結果下記のようなSQLしか思いつかず、結局年月で絞り込んだデータはまだとれていません。

CREATE VIEW 1_VIEW AS
SELECT
コード1,コード2,SUM(売上),日付
FROM TABLE1
GROUP BY コード1,コード2

ここからどのように変えれば年月でも絞り込んだデータをビューに取り込むことができるのでしょうか?
よろしくお願いいたします。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2008-02-18 15:22
trunc関数を使います。

CREATE VIEW 1_VIEW AS
SELECT
コード1,コード2,SUM(売上),日付
FROM TABLE1
GROUP BY コード1,コード2,trunc(日付,'MONTH');
未記入
会議室デビュー日: 2006/11/10
投稿数: 12
投稿日時: 2008-02-18 15:25
SELECT
コード1,コード2,SUM(売上),TO_CHAR(日付, 'YYYY/MM')
FROM TABLE1
GROUP BY コード1,コード2 ,TO_CHAR(日付, 'YYYY/MM')


TO_CHARの中はうろ覚え
ふらわー
常連さん
会議室デビュー日: 2008/01/11
投稿数: 33
投稿日時: 2008-02-18 15:39
すいません、ひとつ付け足しをさせてください。

テーブル内の日付データ型はVARCHAR2(10)です。
日付型ではありません。。。

カーニー様
早速返事いただいたのに、カーニー様の提示していただいたSQLでは日付型ではないため使えませんでした。
説明不足で申し訳ありません。
もしやこの場合できないのではないかと思えてきました。
一度ビューで日付の列を日付型に変換してそこから再びビューを作成するといったようなことが必要なのでしょうか??


未記入様
このデータには膨大な量がある為、またいつからいつまでのデータが入っているか分からないため、いちいちSQL文内のグループ化するところで「'YYYY/MM'」というように指定できません。
グループ化するところを汎用的に使えるようにしたいのです。
未記入
会議室デビュー日: 2006/11/10
投稿数: 12
投稿日時: 2008-02-18 16:01
カーニーさんと私の示した例は
やりたいことは一緒です。
日付を無視した年月で、グループ化する
です。


> テーブル内の日付データ型はVARCHAR2(10)です。
> 日付型ではありません。。。

文字列に変換すればいいのでは?


> このデータには膨大な量がある為、またいつからいつまでのデータが入っているか分からないため、
> いちいちSQL文内のグループ化するところで「'YYYY/MM'」というように指定できません。
> グループ化するところを汎用的に使えるようにしたいのです。

日付を文字に変換を意図していたので
文字型ならば、SUBSTRあたりで、年月データに切るか、
SQL内で、日付型に変換してカーニーさんの例で対処するとか。

理由として使えないとおっしゃっている意図が
わかりません。
ダメデータがいっぱいあって使えないというのであれば
それはまた、別の問題です。

むーみん
常連さん
会議室デビュー日: 2005/06/23
投稿数: 41
投稿日時: 2008-02-18 16:24
引用:

このデータには膨大な量がある為、またいつからいつまでのデータが入っているか分からないため、いちいちSQL文内のグループ化するところで「'YYYY/MM'」というように指定できません。
グループ化するところを汎用的に使えるようにしたいのです。



おそらく、なのですが、ふらわーさんは、TO_CHAR(日付, 'YYYY/MM')の意味を、
TO_CHAR(日付, '2008/02')等のように指定して使用するものだと勘違いされたのではないでしょうか。
TO_CHAR(日付, 'YYYY/MM')は、日付値を'YYYY/MM'書式の文字列に変換するという関数ですので、未記入さんの書かれたとおり記述すれば意図する結果が得られます。
"日付"列が「日付型」という前提の場合でしたが。。

違ったら余計なこといって申し訳ないです。

文字列であれば、必ず'YYYY/MM/DD'形式の文字列が入っているという前提なら、未記入さんがそのあとにおっしゃった方法でできると思います。
ふらわー
常連さん
会議室デビュー日: 2008/01/11
投稿数: 33
投稿日時: 2008-02-18 17:41
難しく考えすぎていたようです。

CREATE VIEW 1_VIEW AS
SELECT
コード1,コード2,SUM(売上),substr(日付,0,7)
FROM TABLE1
GROUP BY コード1,コード2,substr(日付,0,7)

上記のSQLでできました。

未記入様、むーみん様ありがとうございました。

しかしよく考えてみるとこれでは問題がありましたので、再度質問させていただきます。

ビューの作成の仕方を勘違いしていました。
たびたび申し訳ありません。

ビューには
[コード1][コード2][年月1売上][年月2売上][年月3売上][年月4売上][年月5売上][年月6売上][年月7売上][年月8売上][年月9売上][年月10売上[年月11売上][年月12売上]

というようにSQLで取得したデータを最終的には縦並びではなく、横並びにしないといけませんでした。
最初に提示したデータではこんな風になりませんが、例としては以下のようなビューを作成したいです。

[コード1][コード2][年月1売上][年月2売上][年月3売上][年月4売上][年月5売上][年月6売上][年月7売上][年月8売上][年月9売上][年月10売上[年月11売上][年月12売上]
01,001, 50000, 1000, 100,2000,10000, 5000,8000,6000,3000,400,1000,700
02,001, 20000,50000,1000, 100, 2000,10000, 900,4000,1000,200, 500,300
03,001,100000,10000,1000,5000,50000,10000,1000,8000,5000,500,8000,800


これではちょっと最初の質問と変わってくるのですが・・・すいません。

ぜひお力を貸してください。よろしくお願いいたします。
上総
大ベテラン
会議室デビュー日: 2006/06/22
投稿数: 107
投稿日時: 2008-02-18 18:15
コード:
SELECT      ALL
            コード1,
            コード2,
            ,
            SUM ( 年月1 ) 年月1売上,
            SUM ( 年月2 ) 年月2売上,
            SUM ( 年月3 ) 年月3売上,
            SUM ( 年月4 ) 年月4売上,
            SUM ( 年月5 ) 年月5売上,
            SUM ( 年月6 ) 年月6売上,
            SUM ( 年月7 ) 年月7売上,
            SUM ( 年月8 ) 年月8売上,
            SUM ( 年月9 ) 年月9売上,
            SUM ( 年月10 ) 年月10売上,
            SUM ( 年月11 ) 年月11売上,
            SUM ( 年月12 ) 年月12売上
FROM        (
            SELECT      ALL
                        コード1,
                        コード2,
                        SUBSTR ( 日付, 0, 4 ) 年,
                        DECODE ( SUBSTR ( 日付, 6, 2 ) = '01', 売上, 0 ) AS 年月1,
                        DECODE ( SUBSTR ( 日付, 6, 2 ) = '02', 売上, 0 ) AS 年月2,
                        DECODE ( SUBSTR ( 日付, 6, 2 ) = '03', 売上, 0 ) AS 年月3,
                        DECODE ( SUBSTR ( 日付, 6, 2 ) = '04', 売上, 0 ) AS 年月4,
                        DECODE ( SUBSTR ( 日付, 6, 2 ) = '05', 売上, 0 ) AS 年月5,
                        DECODE ( SUBSTR ( 日付, 6, 2 ) = '06', 売上, 0 ) AS 年月6,
                        DECODE ( SUBSTR ( 日付, 6, 2 ) = '07', 売上, 0 ) AS 年月7,
                        DECODE ( SUBSTR ( 日付, 6, 2 ) = '08', 売上, 0 ) AS 年月8,
                        DECODE ( SUBSTR ( 日付, 6, 2 ) = '09', 売上, 0 ) AS 年月9,
                        DECODE ( SUBSTR ( 日付, 6, 2 ) = '10', 売上, 0 ) AS 年月10,
                        DECODE ( SUBSTR ( 日付, 6, 2 ) = '11', 売上, 0 ) AS 年月11,
                        DECODE ( SUBSTR ( 日付, 6, 2 ) = '12', 売上, 0 ) AS 年月12
            FROM        TABLE1
            ) AS TEMP
GROUP BY    コード1,
            コード2,
            



グループ化の条件に年を入れないと、データがおかしくなるので注意が必要です。
上記のSQLでビューを作成すれば問題ないかと・・・
1

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