人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

このようなDBのテーブルがあります。

purchase_data table:
+---------------+---------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------------------+------+-----+---------------------+----------------+
| data_id | bigint(20) unsigned | | PRI | NULL | auto_increment |
| purchase_date | datetime | | MUL | 0000-00-00 00:00:00 | |
| user_id | int(10) unsigned | | MUL | 0 | |
| pay | int(10) unsigned | | | 0 | |
+---------------+---------------------+------+-----+---------------------+----------------+

MySQLで以下のようなSQL文を作成しました。

SELECT user_id, sum(pay) as total
,sum(IF(purchase_date between '20061001' and '20061101',pay, 0)) as Oct
FROM purchase_data
WHERE purchase_date >= "2006/09/01"
GROUP BY user_id
ORDER BY total DESC
limit 30;

これと同じ出力になるOracle 8.1 へのSQL文を作れなくて困っています。どなたか教えていただけないでしょうか?無事に同じ出力が出たときのヒントとなった回答にポイント差し上げます。

●質問者: izumi-h
●カテゴリ:ウェブ制作
✍キーワード:00 2006 as DB FIELD
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● andi
●0ポイント

Oracle8.1が無いので勘になってしまいますが、どうでしょうか。

?グループ化したuser_idとその合計を集計した物sum(pay)を合計の降順に30件集計したインラインビューAを作る

?グループ化したuser_idと10月分の合計を集計したインラインビューBを作る

?AとBをuser_idで結合し合計の降順にソート

select user_id,total,Oct

from (

select *

from(

select user_id,sum(pay) as total

from purchase_data

where purchase_date >= to_date('2006/09/01','YYYY/MM/DD')

group by user_id

order by total desc

)

where rownum <= 30

) A,

(

select *

from select user_id,sum(pay) as Oct

where purchase_date between to_date('2006/10/01','YYYY/MM/DD')

and ('2006/11/01','YYYY/MM/DD')

group by user_id

) B

where A.user_id = B.user_id

order by total desc

◎質問者からの返答

ご回答ありがとうございます。9月以降の売上ベスト30位の方について、10月にも売上が発生しているときはうまくいきました。10月に売上がないときは、当該ユーザの出力が行われなかったのですが、どうでしょうか?


2 ● b-wind
●200ポイント ベストアンサー
SELECT * FROM ( SELECT user_id, sum(pay) as total
,sum(
 decode((purchase_date between to_date('20061001','YYYYMMDD') and to_date('20061101','YYYYMMDD')),TRUE,pay, 0))
as Oct
FROM purchase_data
WHERE purchase_date >= to_date('2006/09/01','YYYY/MM/DD') 
GROUP BY user_id
ORDER BY total DESC
) AS TABLE_A
where rownum <= 30;

試せる環境に無いので、decode() の中身が自信ないです。

◎質問者からの返答

decode(purchase_date between to_date('20061001','YYYYMMDD') and to_date('20061101','YYYYMMDD')),TRUE, の部分がうまくいかなかったです。decodeを使うのがよさそうですが、調べてみましたけど、日付の判定をどうやってdecodeの中に入れ込んだらいいかわかりませんでした。どうしたものか・・。


3 ● andi
●200ポイント

私のSQLの一部を外部結合にして解決できませんでしょうか?駄目でしたらすみません。

where A.user_id = B.user_id

where A.user_id(+) = B.user_id

>> b-windさんのSQL

OracleのSQLにはbooleanが無い為、TRUEと言う値は使用できません。多分。

decode((purchase_date between to_date('20061001','YYYYMMDD') and to_date('20061101','YYYYMMDD')),TRUE,pay, 0))

decode(to_char(purchase_date,'YYYYMM'),'200610',pay,0)

こうしたらいけるかもです。

◎質問者からの返答

外部結合のほうは少し試してみましたがうまくいきませんでした。(原因を調べてないです。)

それでto_char(purchase_date,'YYYYMM'),'200610'のほうで無事に同様の出力を得ることができました。どうもありがとうございました。これにて回答の受付は一時停止扱いにして、晩にポイントの処理をします。よろしくお願いいたします。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ