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

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

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

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

SQL

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

Q&A

解決済

4回答

3179閲覧

SQLの行固定出力について

duster

総合スコア13

MySQL

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

SQL

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

0グッド

0クリップ

投稿2017/02/26 11:44

編集2017/02/26 12:40

表題の件が分からないため教えて下さい。

================================

店テーブル
店コード 店名
1 A店
2 B店

売上テーブル
年度 店コード C商品売上高 C商品回収高 D商品売上高 D商品回収高
2015 1 5000 9000 5000 80000
2015 2 8000 12000 1000 30000
2016 1 7000 11000 6000 10000
2016 2 7000 13000 5000 10000

上記のテーブルを結合した場合の結果が、

商品 店コード 2015年度売上 2015年度回収 2016年度売上 2016年度回収
C商品 1 5000 9000 7000 11000
D商品 1 5000 8000 6000 10000

上記のように、一つの店に絞っての摘出を考えております。
商品名の行固定の名前の付け方や、列管理していたデータを行で表示する方法がわかりません。

ご教示の程、よろしくお願い致します。

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

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

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

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

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

guest

回答4

0

お求めの表は SQL でできないことはないと思いますが、労力に見合わないと思います。
素直に別の言語を使った方が良さそうです。

また、それ以前の問題として、テーブルの設計が悪い気がします。まるで Excel のようです。
商品が増える度にテーブルが横に伸びていくのはとても気持ち悪いです。
例えば次のようなテーブル構造だったとしたらもっと扱いやすく、集計も楽になると思います。

店コード店名
1A 店
2B 店
商品コード商品名
3商品 C
4商品 D
年度店コード商品コード売上回収
20151350009000
201514500080000
201523800012000
201524100030000
201613700011000
201614600010000
201623700013000
201624500010000

投稿2017/02/26 14:05

編集2017/02/26 14:22
Zuishin

総合スコア28660

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

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

Orlofsky

2017/02/26 16:33

時々第一正規化さえなっていないシステムの改善を求められて、今のシステムを捨てて作り直した方が安上がりです、って言わざるを得ないことがあります。質問者が勉強環境でお試しで作ったテーブルであることを願います。
duster

2017/02/27 13:07

今回は勉強目的で作成したテーブルです。 確かに、ご回答頂いたテーブルの方がイメージがつきやすく摘出しやすいと思いました。 ご回答頂きありがとうございます。
guest

0

こうですかね?

  • 元データ

SQL

1create table uriage(y int,shop int,c1 int,c2 int,d1 int,d2 int); 2insert into uriage values 3(2015,1,5000,9000,5000,80000), 4(2015,2,8000,12000,1000,30000), 5(2016,1,7000,11000,6000,10000), 6(2016,2,7000,13000,5000,10000);
  • 集計

SQL

1select item,shop 2,sum((y=2015)*uriage) as u2015 3,sum((y=2015)*kaishu) as k2015 4,sum((y=2016)*uriage) as u2016 5,sum((y=2016)*kaishu) as k2016 6from ( 7select y,shop,'c' as item,c1 as uriage,c2 as kaishu from uriage 8union all select y,shop,'d',d1,d2 from uriage 9) as temp 10where shop=1 11group by item,shop; 12

投稿2017/02/27 00:43

yambejp

総合スコア114784

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

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

duster

2017/02/27 13:14

ご回答頂きありがとうございます。 確かに元データがそのようなら、SQLも短くなり分かりやすく思います。 そのような摘出方法も勉強になりました。
guest

0

ベストアンサー

元のテーブルを前提にすると、おそらくこんな感じのSQLにするしかないです(未検証なので間違ってるかもしれないけど)。店テーブルはデータが欲しい結果に含まれていないため使用していません。

SQL

1SELECT 2 'C商品' AS 商品 3 ,S2015.店コード 4 ,S2015.C商品売上高 AS 2015年度売上 5 ,S2015.C商品回収高 AS 2015年度回収 6 ,S2016.C商品売上高 AS 2016年度売上 7 ,S2016.C商品回収高 AS 2016年度回収 8FROM 9 (SELECT 店コード, C商品売上高 ,C商品回収高 FROM 売上テーブル 10 WHERE 年度 = 2015) AS S2015 11 INNER JOIN 12 (SELECT 店コード, C商品売上高 ,C商品回収高 FROM 売上テーブル 13 WHERE 年度 = 2016) AS S2016 14 ON S2015.店コード = S2016.店コード 15WHERE 16 店コード = 1 17 18UNION ALL 19 20SELECT 21 'D商品' AS 商品 22 ,S2015.店コード 23 ,S2015.D商品売上高 AS 2015年度売上 24 ,S2015.D商品回収高 AS 2015年度回収 25 ,S2016.D商品売上高 AS 2016年度売上 26 ,S2016.D商品回収高 AS 2016年度回収 27FROM 28 (SELECT 店コード, D商品売上高 ,D商品回収高 FROM 売上テーブル 29 WHERE 年度 = 2015) AS S2015 30 INNER JOIN 31 (SELECT 店コード, D商品売上高 ,D商品回収高 FROM 売上テーブル 32 WHERE 年度 = 2016) AS S2016 33 ON S2015.店コード = S2016.店コード 34WHERE 35 店コード = 1

複雑なうえ、これでは年度や商品が変わる度にSQLを見直す必要がありメンテナンス性が非常に悪いです。テーブル自体も毎年カラムの追加が必要でしょう。問題はテーブルが正規化されていないことです。可能であれば売上テーブルを以下のように変更してください。

年度店コード商品売上高回収高
20151C商品50009000
20151D商品500080000
20152C商品800012000
20152D商品100030000
20161C商品700011000
20161D商品600010000
20162C商品700013000
20162D商品500010000

欲しい結果自体が非正規形のため、まだ条件やカラム名を年度ごとに指定する必要がありますが、これでだいぶまともなSQLになります。CASE式と集約関数の利用がポイントです。

SQL

1SELECT 2 商品 3 ,店コード 4 ,MAX(CASE WHEN 年度 = 2015 THEN 売上高 ELSE 0 END) AS 2015年度売上 5 ,MAX(CASE WHEN 年度 = 2015 THEN 回収高 ELSE 0 END) AS 2015年度回収 6 ,MAX(CASE WHEN 年度 = 2016 THEN 売上高 ELSE 0 END) AS 2016年度売上 7 ,MAX(CASE WHEN 年度 = 2016 THEN 回収高 ELSE 0 END) AS 2016年度回収 8FROM 9 売上テーブル 10GROUP BY 11 商品 12 ,店コード 13WHERE 14 店コード = 1

正規化の技術を身に着けてください。

投稿2017/02/26 14:08

編集2017/02/26 14:46
SVC34

総合スコア1149

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

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

duster

2017/02/27 13:11

ご回答頂きありがとうございます。 元テーブルの内容を反映させて頂き無事摘出することが出来ました。 正規化の例も頂きありがとうございます。 確かに商品は横でなく縦で管理すべきでした。
guest

0

欲しい結果が正しくないのではありませんか?
意図しているのは「ある商品の、ある店での売り上げの、年度別売り上げと回収の並び」ですよね。
であるならば結果は

商品店コード2015年度売上2015年度回収2016年度売上2016年度回収
C商品150009000700011000
C商品2800012000700013000
D商品1500080000600010000
D商品2100030000500010000

であってほしいのでは?

投稿2017/02/26 12:22

tacsheaven

総合スコア13703

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

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

duster

2017/02/26 12:38

ご指摘ありがとうございます。 取得イメージが違いました。 商品 店コード 2015年度売上 2015年度回収 2016年度売上 2016年度回収 C商品 1 5000 9000 7000 11000 D商品 1 5000 8000 6000 10000 上記が正しいデータイメージです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問