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

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

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

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

MySQL

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

SQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

3回答

1420閲覧

MySQLで日ごとの売上の合計を地域別で表示させたい

rat_mouse

総合スコア17

MySQL Workbench

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

MySQL

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

SQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/07/20 01:59

編集2021/07/20 02:02

やりたいこと:
MySQLで日ごとの売上の合計を地域別で表示させたい

起きている問題:
地域ごとの売り上げが全て同じ値になる

考えられる原因:
おそらくサブクエリを使用して地域ごとの表示にしている部分で、SUMを使用したことで日ごとの合計が取れていないと思うのですが、解決方法を探しても見つからない状況です。

【SQL】 select DATE_FORMAT(sp.pay_date, "%Y%/%m%/%d") as "日付", (select SUM(price) from student_payments where area_id = 1) as "東京", (select SUM(price) from student_payments where area_id = 2) as "山形", (select SUM(price) from student_payments where area_id = 3) as "大阪", (select SUM(price) from student_payments where area_id = 4) as "京都", ROUND((select SUM(price) from student_payments where area_id = 1) + (select SUM(price) from student_payments where area_id = 2) + (select SUM(price) from student_payments where area_id = 3) + (select SUM(price) from student_payments where area_id = 4)) as "全支社合計" from student_payments sp join areas a on sp.area_id = a.id group by DATE_FORMAT(pay_date, "%Y%m%d") order by sp.pay_date desc

出力結果
イメージ説明

【テーブル】
student_payments
イメージ説明

areas
イメージ説明

不足情報がありましたらご指摘いただければと思います。
よろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/07/20 02:02

サブクエリーで日付、地域、売上を求めるものを作って、日付ごとの合計を求めるクエリーにしたらいいんじゃない?
rat_mouse

2021/07/20 02:08

(select SUM(price) from student_payments where area_id = 1) ↑ この部分のwhere句に日付、地域、売上を絞る記述をするということでしょうか? サブクエリ内で日付で絞る方法がわからず、昨日から悩んでおり、アドバイスをいただけないでしょうか。
yambejp

2021/07/20 02:15

サンプルは画像ではなくテキストでのせてください 可能であればcreate table+insert形式で提示お願いします
guest

回答3

0

ベストアンサー

SUMを使用したことで日ごとの合計が取れていないと思うのですが

いいえ。
サブクエリーとしている時点で、SUM()[集計関数]は関係ありませんので、サブクエリーで日付に関係なく集計された値が返却されています。
※group byを強制するモードではエラーになるパターンです。

SQL

1select pay_date as 日付 2 , SUM(price *(area_id = 1)) as 東京 3 , SUM(price *(area_id = 2)) as 山形 4 , SUM(price *(area_id = 3)) as 大阪 5 , SUM(price *(area_id = 4)) as 京都 6 , ROUND(SUM(price)) as 全支社合計 7from student_payments sp 8 inner join areas a 9 on sp.area_id = a.id 10group by pay_date 11order by pay_date desc

投稿2021/07/20 02:45

sazi

総合スコア25195

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

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

rat_mouse

2021/07/20 05:32

ありがとうございました! サブクエリを使用することに引っ張られていたのですが、シンプルな記述でも集計できるのですね!
guest

0

sql

1select date(sp.pay_date) as "dt", sp.area_id, sum(sp.price) as "sales" 2from student_payments as sp 3group by date(sp.pay_date), sp.area_id;

このカタチで、日付、エリア、売上計が求まると思うんだけど、

sql

1select s.dt, 2 sum(case when s.area_id = 1 then s.sales else 0 end) as "sales_Tokyo", 3 sum(case when s.area_id = 2 then s.sales else 0 end) as "sales_Yamagata", 4 ..., 5 sum(s.sales) as "sales_all" 6from ( 7 select date(sp.pay_date) as "dt", sp.area_id, sum(sp.price) as "sales" 8 from student_payments as sp 9 group by date(sp.pay_date), sp.area_id 10) as s 11group by s.dt;

こうなるとエリアごとの合計と全ての合計が求まりそう。
だけど、エリアっていっぱいあるよね。
「s.area_id = いくつ」のバリエーションを完備すればほしいのは求まると思うけど、
もうちょっと楽に書く方法があるはずなので、もうちょっと考えます。。。

投稿2021/07/20 02:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

pay_date,price,area_idだけで単純化した方がいいですね

SQL

1create table tbl 2(id int primary key,pay_date date,price int,area_id int); 3 4insert into tbl values 5(1,'2021-07-20',1000,1), 6(2,'2021-07-20',1100,2), 7(3,'2021-07-21',1400,1), 8(4,'2021-07-21',2000,1), 9(5,'2021-07-21',2500,2), 10(6,'2021-07-22',1700,1), 11(7,'2021-07-22',1300,3); 12 13select pay_date 14,sum(price*(area_id=1)) as tokyo 15,sum(price*(area_id=2)) as yamagata 16,sum(price*(area_id=3)) as osaka 17,sum(price*(area_id=4)) as kyoto 18,sum(price) as `all` 19from tbl 20group by pay_date 21

※横の計がぬけてたので追記しました

投稿2021/07/20 02:25

編集2021/07/20 02:37
yambejp

総合スコア114839

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

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

yambejp

2021/07/20 02:32

ようはピボット処理ですよね? MySQLの場合例示のような書き方になります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問