質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.77%

ある期間の商品別販売額、推移をクロス集計で求めたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,398

score 45

前提・実現したいこと

商品別に、2007年6月から8月までのそれぞれの月の販売額の推移を出し、7月と8月は前月に対して、増加・変化なし・減少のそれぞれについて、↑・→・↓でそれぞれ表現する表を作成したいです。

多々間違っている部分はあると思うのですが、とりあえず、以下の状態まで作成しました。

発生している問題・エラーメッセージ

実行するとE.ProductIDが見つけられない旨のメッセージが表示されます。(おそらく下から4行目のもの)
サブクエリ同士の結合がうまくいっていないからなのでしょうか。

途中段階でのコード(追記)

SELECT
    D.ProductID
    ,D.ProductName
    ,SUM(CASE WHEN B.年月 = '2007-06' THEN B.Price*B.Quantity ELSE 0 END) AS `6月販売金額`
    ,SUM(CASE WHEN B.年月 = '2007-07' THEN B.Price*B.Quantity ELSE 0 END) AS `7月販売金額`
    ,SUM(CASE WHEN B.年月 = '2007-08' THEN B.Price*B.Quantity ELSE 0 END) AS `8月販売金額`
FROM
      (
     SELECT
        C.ProductID
        ,A.Quantity
        ,C.Price
        ,SUBSTR(A.SaleDate, 1, 7) AS 年月
      FROM
          Sales AS A
            INNER JOIN
        Products AS C
            ON A.ProductID = C.ProductID
      WHERE
    A.SaleDate BETWEEN '2007-06-01' AND '2007-08-31'
     GROUP BY
        C.ProductID
        ,A.Quantity
        ,C.Price
        ,A.SaleDate
 ORDER BY
        C.ProductID 
      ) AS B
            INNER JOIN
      Products AS D
            ON B.ProductID = D.ProductID    
GROUP BY
    D.ProductID
ORDER BY
    D.ProductID
;

以上のコードで
ProductID,ProductName,"6月販売金額","7月販売金額","8月販売金額"を抽出することができます。

ソースコード

SELECT
    P.ProductID
    ,P.ProductName
    ,E."6月販売金額"
    ,E."7月販売金額"
    ,CASE WHEN E."6月販売金額" > E."7月販売金額" THEN "↓"
          WHEN E."6月販売金額" = E."7月販売金額" THEN "→"
          ELSE "↑" END AS "対6月増減"
    ,E."8月販売金額"
    ,CASE WHEN E."7月販売金額" > E."8月販売金額" THEN "↓"
          WHEN E."7月販売金額" = E."8月販売金額" THEN "→"
          ELSE "↑" END AS "対7月増減"
 FROM
        (
         SELECT
            W.ProductID
            ,SUBSTR(Q.SaleDate, 1, 7) AS 年月
         FROM
            Sales AS Q
                INNER JOIN
            Products AS W
         WHERE
            Q.SaleDate BETWEEN '2007-06-01' AND '2007-08-31'
         ) AS B
                INNER JOIN
        (
         SELECT
            D.ProductID
            ,SUM(CASE WHEN B.年月 = '2007-06' THEN D.Price*C.Quantity ELSE 0 END) AS "6月販売金額"
            ,SUM(CASE WHEN B.年月 = '2007-07' THEN D.Price*C.Quantity ELSE 0 END) AS "7月販売金額"
            ,SUM(CASE WHEN B.年月 = '2007-08' THEN D.Price*C.Quantity ELSE 0 END) AS "8月販売金額"
         FROM
            Sales AS C
                INNER JOIN
            Products AS D
                ON C.ProductID = D.ProductID
         GROUP BY
            D.ProductID
        ) AS E
                ON B.ProductID = E.ProductID
                INNER JOIN
            Products AS P
                ON E.ProductID = P.ProductID
ORDER BY
    P.ProductID
;

補足情報(言語/FW/ツール等のバージョンなど)

出力項目:ProductID、ProductName、6月販売金額、7月販売金額、対6月増減、8月販売金額、対7月増減
出力順:ProductID
クロス集計を使用したい
NameをGROUP BYしたくない

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

こんにちは。

こんな感じでしょうか。
確認してみてください。

---------- ↓ ここから ↓ ----------
SELECT
    D.ProductID
  , D.ProductName
  , B.6月販売金額
  , B.7月販売金額
  , CASE WHEN B.6月販売金額 > B.7月販売金額 THEN "↓"
         WHEN B.6月販売金額 = B.7月販売金額 THEN "→"
         ELSE "↑"
    END AS '対6月増減' 
  , B.8月販売金額
  , CASE WHEN B.7月販売金額 > B.8月販売金額 THEN "↓"
         WHEN B.7月販売金額 = B.8月販売金額 THEN "→"
         ELSE "↑"
    END AS '対7月増減' 
FROM
    (
    SELECT
        W.ProductID
      , SUM( CASE WHEN SUBSTR( Q.SaleDate , 1, 7 ) = '2007-06' THEN Q.Quantity * W.Price ELSE 0 END ) AS '6月販売金額'
      , SUM( CASE WHEN SUBSTR( Q.SaleDate , 1, 7 ) = '2007-07' THEN Q.Quantity * W.Price ELSE 0 END ) AS '7月販売金額'
      , SUM( CASE WHEN SUBSTR( Q.SaleDate , 1, 7 ) = '2007-08' THEN Q.Quantity * W.Price ELSE 0 END ) AS '8月販売金額'
    FROM
        Sales AS Q
        INNER JOIN Products AS W
                ON Q.ProductID = W.ProductID
    WHERE
        Q.SaleDate BETWEEN '2007-06-01' AND '2007-08-31'
    GROUP BY
        W.ProductID
    ) AS B
    LEFT JOIN Products AS D
           ON B.ProductID = D.ProductID
ORDER BY
    D.ProductID
---------- ↑ ここまで ↑ ----------

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/10 15:34 編集

    D.ProductIDが見つからないとなると、原因はProductsテーブルのような気もしますが。
    テーブルBのクエリを単体で実行した場合、正常に取得できますでしょうか。
    今度は、W.ProductIDが見つからないって出ませんか?

    項目があるのに見つからないというエラーは、別名を付けたりする(AS 名称)と解決する場合があります。

    キャンセル

  • 2016/02/10 16:02

    Productsテーブルは大分使用しておりますが、今まで特に問題が起きていないことを考えると、そのテーブルに不備があるとは考えにくいです。
    ご助言ありがとうございます。
    もう少し試してみます。

    キャンセル

  • 2016/02/10 20:21

    一度閉じます。
    またよろしくお願いします。

    キャンセル

0

テーブル名などにはダブルではなくバッククォートを使用してください。
Shindo_NJSさんのコードにはバッククォートで囲んでいるようですが、このサイト内ではバッククォートは表示されないようなので、

AS '8月販売金額'AS `8月販売金額`


などバッククォートで囲んでください。
ダブルクォーテーションはテーブル名には使用しません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/10 15:49

    こんにちは。

    たしかに、バッククォートで囲った箇所が変な枠になって表示されています。
    フォローありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る