■68918 / inTopicNo.2) |
Re[1]: SQLで1日毎の集計 |
□投稿者/ 魔界の仮面弁士 (423回)-(2013/11/25(Mon) 10:31:28)
|
■No68910 (ピカチュウ さん) に返信
> FORM デーブル
FORM (フォーム)ですか?
FROM (フロム) ではなく?
テーブル (table) ではなく、
デーブル なのですか?
> 商品 コード 出荷日時
[コード]というのは、商品コードでも出荷番号でも出荷明細行番号でも無さそうですね。
キー構造が良くわかりませんでしたが、とりあえずそれは無視するとして。
> メロン A1 3 0
> イチゴ A1 1 1
> メロン A2 0 1
> 上記のような集計したいのですが
だとすれば、
GROUP BY コード, 商品
ORDER BY コード, 商品
では駄目ですね。その並びにしたいのであれば、
GROUP BY コード, 商品
ORDER BY コード ASC, 商品 DESC
のように、商品側を降順ソートにする必要があります。
もしも、一度の問合せにまとめたいのであれば、下記のようにする手もあります。
SELECT
商品
, コード
, SUM(CASE WHEN 出荷日時 >= TO_DATE('2013/11/23 08:30:00', 'YYYY/MM/DD HH24:MI:SS')
AND 出荷日時 < TO_DATE('2013/11/24 08:30:00', 'YYYY/MM/DD HH24:MI:SS')
THEN 1 ELSE 0 END) AS "11/23"
, SUM(CASE WHEN 出荷日時 >= TO_DATE('2013/11/24 08:30:00', 'YYYY/MM/DD HH24:MI:SS')
AND 出荷日時 < TO_DATE('2013/11/25 08:30:00', 'YYYY/MM/DD HH24:MI:SS')
THEN 1 ELSE 0 END) AS "11/24"
FROM テーブル名
GROUP BY コード, 商品
ORDER BY コード ASC, 商品 DESC
> このSQLだと、これでは毎回日時を入力しなければならないので大変です。(数年分)
クロス集計ですよね。
データを「列」方向に展開しようとすれば、どうしてもそうなってしまうでしょう。
縦並びで良いのなら、日時指定無しで一括集計することもできますが…。
SELECT
商品
, コード
, TRUNC( 出荷日時 - INTERVAL '0 8:0:0' DAY TO SECOND, 'DD' ) AS 出荷日
, COUNT(*) AS 出荷数
FROM テーブル名
-- WHERE 出荷日時 BETWEEN TIMESTAMP '2013-11-01 08:00:00.000000000' AND TIMESTAMP '2013-12-01 07:59:59.999999999'
GROUP BY TRUNC( 出荷日時 - INTERVAL '0 8:0:0' DAY TO SECOND, 'DD'), 商品, コード
ORDER BY コード ASC, 商品 DESC
> 初心者の質問ですみません。どうかご教授宜しくお願い致します。
http://dora0.blog115.fc2.com/blog-entry-85.html
http://www.tt.rim.or.jp/~rudyard/torii009.html
|
|