• 締切済み

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

  • MySQL
  • 回答数2
  • ありがとう数1

みんなの回答

  • 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

  • SQL文を教えてください。

    MYSQLを使っています。 【売上テーブル】 || 日付 || 金額 || ----------------- || 2011/01/01 || 100 || || 2011/01/01 || 200 || || 2011/01/02 || 600 ||           ・           ・           ・ || 2012/12/31 || 500 || || 2012/12/31 || 100 || SELECT SUM(金額) FROM 売上テーブル WHERE 日付 BETWEEN '2011-01-01' AND '2011-12-31' GROUP BY DATE_FORMAT(日付, '%Y/%m') で月初から月末のデータを表示させることはできますが、 2011/01/10~2011/02/09を一か月として 以降は 2011/02/10~2011/03/09 2011/03/10~2011/04/09        ・        ・        ・ 2011/12/10~2012/01/09 といった感じに1年間のデータを表示させる方法がわかりません。 どうぞ宜しくお願いします。

    • ベストアンサー
    • MySQL
  • SQLの書き方を教えて!

    select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd のようにSUMで集計を行うSQLを発行する時に,同時にkingak順にsortすることは可能なのでしょうか? select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd order by SUM(kingak) としたいところですが,これではエラーになりますね。 SQLでは解決できないんでしょうか?

  • クエリにSQL文を書き込みたい

    アクセス2000にてソフト開発しています Q受注グラフというクエリがあります。 データが毎月変化するので、これにVB内に記述したSQL文を書き込みたいのですが、どの様にすれば いいのでしょうか ちなみにSQL文は下記です。 SQL = "SELECT JS.受注年月, JS.部署名, JS.当月受注実績 AS 当月, " & _ "(JY.請負1*10000) AS " & m当月 & ", (JY.請負2*10000) AS " & m翌月 & ", (JY.請負3*10000) AS " & m翌々月 & ", " & _ "FORMAT((JS.受注達成率*100),""###.#"") AS [受注達成率(%)]" & _ "FROM T受注実績集計 AS JS INNER JOIN (T受注予定集計 AS JY INNER JOIN 部署コード AS BC ON JY.部署コード = BC.施工部署コード) " & _ "ON (JY.部署コード = JS.部署コード) AND (JY.実績年月 = JS.受注年月)" & _ "WHERE JS.受注年月 = '" & m実績月 & "'" & _ "ORDER BY BC.部署コード;" 宜しく御願いします

  • SQLで分からないことがあります。

    仕入明細テーブル 伝票NO   インデックス番号   部数 出費詳細テーブル 伝票NO  出費先  出費額 以上のデータがあります。 仕入明細テーブルでインデックス番号でグルーピング化して部数の合計値が2000以上のインデックス番号と同じ値の出費詳細テーブルの伝票NOのレコードを削除しなさい。 delete 出費詳細 where 伝票NO in (select インデックス番号, sum(部数) from 仕入明細             group by インデックス番号             having sum(部数) >= 100); これだと出来ませんよね? sum(部数)が100以上のものを抽出するためにはselectでsum(部数)としなくてはいけないのですが これだとダメですよね?伝票NOと同じか比較するのインデックス番号なので、selectでsum(部数)としないのは可能でしょうか?

  • 簡単なSQLを書くには?

    あるテーブルに列が40~50個ほど存在しており、そのテーブルに置いて合計を求めたいと考えております。 通常の方法であれば、 SELECT SUM(a1), SUM(a2), SUM(a3),.... `table` WHERE b1="0" OREDER BY c1 と書くのですが、列が40個もSUM()を書き続けるのが面倒なので何か簡単に合計を求めるSQLをご存じありませんでしょうか?

    • ベストアンサー
    • MySQL
  • SQL EXISTS演算子について

    ------------------------------------------------------- SELECT DISTINCT 商社.商社名 FROM 商社 WHERE NOT EXISTS (SELECT * FROM 商品 WHERE NOT EXISTS (SELECT * FROM 納品 WHERE 納品.商品番号 = 商品.商品番号 AND 納品.商社番号 = 商社.商社番号)) 各テーブルレイアウト 納品([商品番号]、[商社番号]、納品数量) 商品([商品番号]、商品名) 商社([商社番号]、商社名) []は主キー 条件:納品表に行が存在することは、その商品を商社が納品することを意味する。 --------------------------------------------------------- 上記SQLは、「全ての商品を納入する商社の商社名を求める」ものだそうですが、なぜそうなるのか理解できません。 具体的にどういう判定でそうなるのか教えていただけないでしょうか。

  • 売り上げ集計SQLが作れません

    1つのTABLEに、1日の売上げ高を商品ごとに登録していくDBがあります。 簡単な構造は以下のとおりです。 日付       |A品売上額  |B品売上額 | 2008/11/01 |500000    |600000   | 2008/11/02 |450000    |800000   | 2008/11/03 |100000    |700000   | ・・・ 2008/11/30 |200000    |500000   | 2008/12/01 |300000    |100000   | <質問> それぞれの商品の1ヶ月売上高をSQLで抽出したいと思うのですが、Group byで何を指定したらいけるのかわからず困っています。 SQLで計算せずに抽出だけ行って、CGI側で計算するしかないのでしょうか? アドバイスお願いいたします。 <最初に考えたSQL(Group byがないためエラーになりました)> select sum(a),sum(b) from uriage where date between '2008/11/01' AND '2008/11/30';

  • SELECT の仕方 (今月のデータを取り出す)

    SELECT ○○ FROM ×× WHERE date = 今月分 と言った感じで、今月挿入されたデータを取り出したいのですが、良い方法はありませんか。 select date_format(now(), '%m') か何かを組み合わせれば良いのかと試しましたが、うまくいきませんでした。(文法のミスかもしれません) よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 今週の日曜日から土曜日までの要素の抽出

    次のようなテーブルがあります。 info{ name varchar(50) release date } 今週の日曜日(6/21)から土曜日(6/27)までの要素を抽出するため 次のようなSQL文を実行しました。 SELECT name FROM info WHERE release BETWEEN DATE_SUB( DATE(NOW()), INTERVAL DATE_FORMAT(NOW(), '%W') DAY ) and DATE_ADD( DATE(NOW()), INTERVAL WEEKDAY(NOW()) DAY ) この構文でエラーがでてしまいます。 BETWEENのand前後の指定は間違っていないと思うのですが どこが悪いのかわかりません。 ご教授願います。

    • ベストアンサー
    • MySQL
  • 一部データを除外するSQL

    SQL(MySQL)についての質問です。 顧客データの中からある月の誕生日のデータを抽出しようと考えています。 6月生まれだったら、 SELECT * FROM customer WHERE DATE_FORMAT(birthday, '%m')= 6; 12月生まれだったら SELECT * FROM customer WHERE DATE_FORMAT(birthday, '%m')= 12; でできるんですが、実は顧客データの中には誕生日がわからない人がいて、 その場合「1900-01-01」をセットしています。 ですので、1月生まれを指定する SELECT * FROM customer WHERE DATE_FORMAT(birthday, '%m')= 1; とすると誕生日が「1900-01-01」の人も含まれてしまいます。 誕生日「1900-01-01」のデータを排除するSQLがわからなくて困っています。 NOT IN とか EXCEPT とか使ってみたんですがうまくいきませんでした。 どなたか教えて頂けると大変うれしいです。 よろしくお願いします。

    • ベストアンサー
    • MySQL