• 締切済み

このぐるぐる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 商品番号;

みんなの回答

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.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に投げるとか、インターフェースとなるプログラムで別途結合する方が良いと思われます。

回答No.1

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

Passerby01
質問者

お礼

あっ なるほど

関連するQ&A