こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

このぐるぐるSQLクエリまとまりますか?

ピボット集計の理解が難しくて難儀してます
このような予定表を作るのですが毎月ごとに集計してやるのに
4回問い合わせております。一回でえいやっと投げるにはどう記述しましょう?
mysql 5.0です
-- 今月 --
SELECT 商品番号,sum(受注金額) FROM 注文受付テーブル
where DATE_FORMAT(納入日, '%Y%m') = DATE_FORMAT(NOW(), '%Y%m')
group by 商品番号;
-- 来月 --
SELECT 商品番号,sum(受注金額) FROM 注文受付テーブル
where DATE_FORMAT(納入日, '%Y%m') = DATE_FORMAT(NOW()+ INTERVAL 1 MONTH, '%Y%m')
group by 商品番号;
-- 再来月 --
SELECT 商品番号,sum(受注金額) FROM 注文受付テーブル
where DATE_FORMAT(納入日, '%Y%m') = DATE_FORMAT(NOW()+ INTERVAL 2 MONTH, '%Y%m')
group by 商品番号;
-- ささらい月 --
SELECT 商品番号,sum(受注金額) FROM 注文受付テーブル
where DATE_FORMAT(納入日, '%Y%m') = DATE_FORMAT(NOW()+ INTERVAL 3 MONTH, '%Y%m')
group by 商品番号;

投稿日時 - 2019-11-04 01:08:19

QNo.9674675

暇なときに回答ください

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(2)

ANo.2

全部の月に全ての商品が網羅されていて月が限定されているなら、なんとかなるかな。
select文のfrom句。普通は、テーブル名を入れますが、実は、ここに、副問合せ、要するにselect文がかけます。
つまり、
select kongetu.商品番号, sum(受注金額) from (select 商品番号,受注金額 from 注文受付テーブル where DATE_FORMAT(納入日, '%Y%m') = DATE_FORMAT(NOW(), '%Y%m') ) as kongetu join (select 商品番号,受注金額 from 注文受付テーブル where DATE_FORMAT(納入日, '%Y%m') = DATE_FORMAT(NOW()+ INTERVAL 1 MONTH, '%Y%m')) as raigetu on kongetu.商品番号=raigetu.商品番号
group by kongetu.商品番号
という感じ。select文の結果をテーブルとみなすわけです。
でも、すごく読みにくいですね。もしかすると、わたしも打ち間違えているかも=^・・;=
流石に、これを4つのテーブルで作成したら、もはやメンテナンス不能なselct文が出来上がってしまうので、せめてメンテナンスが現実的になるように収めるなら、今月・来月・再来月・ささ来月の4つのグループ化済みのviewを作成し、それを結合して返す感じかなと思います。
問の4つsqlを結合する際に、外部結合が必要かどうかで、select文が変わってくるので、具体的なsqlは、ここでは書けないです。もし、full outer joinが必要なパターンだとすると、unionで結合する必要が出てくるので、viewを使ってもかなりの長文となりすごく低速になることでしょう。(4つのテーブルの全ての左右外部結合の組み合わせをunionして、重複を除去することになります。)
現実解は、4つのsqlを投げて、そういう集計が得意なexcelに投げるとか、インターフェースとなるプログラムで別途結合する方が良いと思われます。

投稿日時 - 2019-11-07 22:41:16

ANo.1

いま投げているクエリの間に
・union all
を入れれば1回になります。
ただくっつけただけどと、どの結果か分からなくなりますので、
・select 1, '先月', …
のようにして
・order by 1
でソートすれは大丈夫です。

投稿日時 - 2019-11-04 08:01:53

お礼

あっ なるほど

投稿日時 - 2019-11-04 19:55:17

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-