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

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

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

3301閲覧

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

yyy

総合スコア49

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/02/10 02:52

編集2016/02/10 07:00

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

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

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

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

My

1 2SELECT 3 D.ProductID 4 ,D.ProductName 5 ,SUM(CASE WHEN B.年月 = '2007-06' THEN B.Price*B.Quantity ELSE 0 END) AS `6月販売金額` 6 ,SUM(CASE WHEN B.年月 = '2007-07' THEN B.Price*B.Quantity ELSE 0 END) AS `7月販売金額` 7 ,SUM(CASE WHEN B.年月 = '2007-08' THEN B.Price*B.Quantity ELSE 0 END) AS `8月販売金額` 8FROM 9 ( 10 SELECT 11 C.ProductID 12 ,A.Quantity 13 ,C.Price 14 ,SUBSTR(A.SaleDate, 1, 7) AS 年月 15 FROM 16 Sales AS A 17 INNER JOIN 18 Products AS C 19 ON A.ProductID = C.ProductID 20 WHERE 21 A.SaleDate BETWEEN '2007-06-01' AND '2007-08-31' 22 GROUP BY 23 C.ProductID 24 ,A.Quantity 25 ,C.Price 26 ,A.SaleDate 27 ORDER BY 28 C.ProductID 29 ) AS B 30 INNER JOIN 31 Products AS D 32 ON B.ProductID = D.ProductID 33GROUP BY 34 D.ProductID 35ORDER BY 36 D.ProductID 37; 38```以上のコードで 39ProductID,ProductName,"6月販売金額","7月販売金額","8月販売金額"を抽出することができます。 40###ソースコード 41 42```My SQL 43SELECT 44 P.ProductID 45 ,P.ProductName 46 ,E."6月販売金額" 47 ,E."7月販売金額" 48 ,CASE WHEN E."6月販売金額" > E."7月販売金額" THEN "↓" 49 WHEN E."6月販売金額" = E."7月販売金額" THEN "→" 50 ELSE "↑" END AS "対6月増減" 51 ,E."8月販売金額" 52 ,CASE WHEN E."7月販売金額" > E."8月販売金額" THEN "↓" 53 WHEN E."7月販売金額" = E."8月販売金額" THEN "→" 54 ELSE "↑" END AS "対7月増減" 55 FROM 56 ( 57 SELECT 58 W.ProductID 59 ,SUBSTR(Q.SaleDate, 1, 7) AS 年月 60 FROM 61 Sales AS Q 62 INNER JOIN 63 Products AS W 64 WHERE 65 Q.SaleDate BETWEEN '2007-06-01' AND '2007-08-31' 66 ) AS B 67 INNER JOIN 68 ( 69 SELECT 70 D.ProductID 71 ,SUM(CASE WHEN B.年月 = '2007-06' THEN D.Price*C.Quantity ELSE 0 END) AS "6月販売金額" 72 ,SUM(CASE WHEN B.年月 = '2007-07' THEN D.Price*C.Quantity ELSE 0 END) AS "7月販売金額" 73 ,SUM(CASE WHEN B.年月 = '2007-08' THEN D.Price*C.Quantity ELSE 0 END) AS "8月販売金額" 74 FROM 75 Sales AS C 76 INNER JOIN 77 Products AS D 78 ON C.ProductID = D.ProductID 79 GROUP BY 80 D.ProductID 81 ) AS E 82 ON B.ProductID = E.ProductID 83 INNER JOIN 84 Products AS P 85 ON E.ProductID = P.ProductID 86ORDER BY 87 P.ProductID 88;

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

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

---------- ↓ ここから ↓ ----------
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 05:32

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yyy

2016/02/10 05:57

今度はD.ProductID が見つからないという内容のメッセージが出てしまいました…。
退会済みユーザー

退会済みユーザー

2016/02/10 06:04

こんにちは。 今一度、ProductsテーブルまたはSalesテーブルの項目名を確認して頂けますでしょうか。 おそらく、微妙に名前が違ってたりしませんか?
yyy

2016/02/10 06:19

再度確認しましたが間違っているところが見当たらないのです。 通常この形だったらD.ProductIDが見つからないことなんてないと思うのですがなんでなのでしょう…
退会済みユーザー

退会済みユーザー

2016/02/10 06:44 編集

D.ProductIDが見つからないとなると、原因はProductsテーブルのような気もしますが。 テーブルBのクエリを単体で実行した場合、正常に取得できますでしょうか。 今度は、W.ProductIDが見つからないって出ませんか? 項目があるのに見つからないというエラーは、別名を付けたりする(AS 名称)と解決する場合があります。
yyy

2016/02/10 07:02

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

2016/02/10 11:21

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

0

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

mysql

1 AS '8月販売金額' を AS `8月販売金額` 2 3``` 4などバッククォートで囲んでください。 5ダブルクォーテーションはテーブル名には使用しません。

投稿2016/02/10 06:42

date

総合スコア1820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/02/10 06:49

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問