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

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

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

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

Q&A

解決済

2回答

7026閲覧

MySQL:クロス集計を行いたい

taxi

総合スコア14

MySQL

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

0グッド

0クリップ

投稿2019/02/18 08:18

前提・実現したいこと

SQL初心者です。
以下のテーブルからピボットテーブルのような集計を行いたいのですが、私の知識では実現できず、ご教示をお願いしたく質問させていただきます。

テーブル:取引一覧

日付業者数量地域
2018-01-14A業者1中国1
2018-01-28A業者2日本0
2018-01-22B業者1アメリカ1
2018-01-08C業者4スイス1
2018-01-17C業者1日本0
2018-02-01A業者2オーストラリア1
2018-02-10B業者1日本0
2018-02-21B業者1タイ1
2018-02-03C業者2中国1
2018-02-25C業者1日本0

実際はもっとカラムが多いですが割愛

最終的に欲しいデータ
国別月別で数量の合計を出したい。

業者2018-01(の数量)2018-02(の数量)
アメリカB業者10
オーストラリアA業者02
タイB業者01
中国A業者10
中国C業者01
日本A業者20
日本B業者01
日本C業者11

試したこと

以下のクエリで集計に必要なデータを抽出するところまではできたのですが、ここからどのように持っていったら良いのかがわかりません。

もしSQL文だけでは実現が難しいようであれば、PHPは少しわかりますので、PHP側でデータ操作が発生しても構いませんので、アドバイスをいただけますと幸いです。
宜しくお願いいたします。

SQL

1SELECT DATE_FORMAT(日付,'%Y-%m') AS, 業者, SUM(数量),FROM 取引一覧 GROUP BY,;

結果

業者数量
2018-01B業者1アメリカ
2018-01A業者1中国
2018-01A業者2日本
2018-01C業者1日本
2018-02A業者2オーストラリア
2018-02B業者1タイ
2018-02C業者1中国
2018-02B業者1日本
2018-02C業者1日本

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

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

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

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

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

guest

回答2

0

ベストアンサー

スイスの立場は・・・

SQL

1create table tbl( 2日付 date,業者 varchar(20),数量 int,varchar(20),地域 int); 3 4insert into tbl values 5('2018-01-14','A業者',1,'中国',1), 6('2018-01-28','A業者',2,'日本',0), 7('2018-01-22','B業者',1,'アメリカ',1), 8('2018-01-08','C業者',4,'スイス',1), 9('2018-01-17','C業者',1,'日本',0), 10('2018-02-01','A業者',2,'オーストラリア',1), 11('2018-02-10','B業者',1,'日本',0), 12('2018-02-21','B業者',1,'タイ',1), 13('2018-02-03','C業者',2,'中国',1), 14('2018-02-25','C業者',1,'日本',0); 15 16select,業者 17,sum((DATE_FORMAT(日付,'%Y-%m')='2018-01')*数量) as `x1801` 18,sum((DATE_FORMAT(日付,'%Y-%m')='2018-02')*数量) as `x1802` 19from tbl 20group by,業者

投稿2019/02/18 09:54

yambejp

総合スコア114829

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

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

taxi

2019/02/19 00:30 編集

! スイス抜けてましたね・・・うっかりです。 試してみたところ期待通りの結果が得られました。 自分の中では「SUM((DATE_FORMAT(日付,'%Y-%m')='2018-01')*数量)」の部分が消化しきれていません。 これは日付判定がtrueであれば1*数量をSUMしているということでいいのでしょうか。 業務上必要な場合しか触っていないのでまだまだ知識不足です。 ともあれ、これで見通しがつきました。 ご教示いただきありがとうございました。
yambejp

2019/02/19 00:36

> 日付判定がtrueであれば1*数量をSUMしている そうです、mysqlの特徴でtrueを1、falseを0と判断することから 集計では多用します
taxi

2019/02/19 01:12

なるほど、そうなのですね。 これでスッキリしました。 これまではデータ操作はPHP側でやることが多かったので、クエリでのデータ操作ができれば幅が広がりそうです。 ありがとうございました。
guest

0

年度毎に集計したい が参考になるのでは?

投稿2019/02/18 08:25

Orlofsky

総合スコア16415

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

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

taxi

2019/02/18 08:32

情報ありがとうございます。 早速確認してみます。
taxi

2019/02/19 00:22

提供いただいた情報は私にはちょっと難しかったのですが、yambejp様の情報と合わせて見て該当の箇所がわかりました。 期待通りの結果が出ても内容を理解しないと身につかないのでもっと勉強しないといけないですね。 ご教示いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問