- ベストアンサー
SQLをどのように記述すれば出来ますか?
SQLをどのように記述すれば出来ますか? >データベース 種目 年月 金額 AA 200501 1000 AA 200502 1000 AA 200503 1000 BB 200501 1000 BB 200502 1000 CC 200503 1000 DD ・・・ >表示形式 種目 合計 年月1 年月2 年月3 AA 3000 1000 1000 1000 BB 2000 1000 1000 CC 1000 1000 DD ・・・ ※注意点 年月範囲は固定ではなく適宜指定可能とする。 また、該当するデータが無い場合は空白とする。 上記の場合は「200501~200503」を指定した。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
なんか面白いやりかたが合ったので紹介します。 ピボットテーブルをつかうやり方。 ピボットテーブルとは、縦横おなじにて、斜めに1 がはいっているテーブルです。 年月 200501 200502 200503 ・・・ 200501 1 0 0 200502 0 1 0 200503 0 0 1 ・・・ 作り方はこんなかんじ CREATE TABLE `pivot` (`年月` VARCHAR(6) ,`200501`INT(1) DEFAULT 0 ,`200502`INT(1) DEFAULT 0 ,`200503`INT(1) DEFAULT 0 ,`200504`INT(1) DEFAULT 0 ,`200505`INT(1) DEFAULT 0 ,`200506`INT(1) DEFAULT 0 ,UNIQUE(`年月`) ); INSERT INTO `pivot` (`年月`) values('200501'),('200502'),('200503'),('200504'),('200505'),('200506'); UPDATE `pivot` set `200501`=1 WHERE `年月`='200501'; UPDATE `pivot` set `200502`=1 WHERE `年月`='200502'; UPDATE `pivot` set `200503`=1 WHERE `年月`='200503'; UPDATE `pivot` set `200504`=1 WHERE `年月`='200504'; UPDATE `pivot` set `200505`=1 WHERE `年月`='200505'; UPDATE `pivot` set `200506`=1 WHERE `年月`='200506'; そこで、以下のSQLをすると一発ででます SELECT `種別`,SUM(`金額`), SUM(`金額`*`200501`),SUM(`金額`*`200502`),SUM(`金額`*`200503`) FROM `DB` LEFT JOIN `pivot` ON `DB`.`年月`=`pivot`.`年月` WHERE `DB`.`年月` BETWEEN '200501' AND '200503' GROUP BY `種別`; メンテナンス用にピボットテーブルを予め大きめに 作っておくと良いかもしれませんね。
その他の回答 (4)
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
DBが何なのか判らないと、答えようがありません。 ACCESSであれば、#1や#4で書かれているようなTRANSFORMによる ピボット集計ができますが、他のデータベースでは使えません。 他のデータベース場合は、CASE文やDECODE式を使って、クロス集約する必要が あります。
- CHRONOS_0
- ベストアンサー率54% (457/838)
年月は降順でいいのでしょうか アップされた結果はちょっと違っていますよ 列名: "年月" & DCount("*","google","年月<=" & [年月] & " and 種目='" & [種目] & "'") という式フィールドを作り クロス集計クエリに変えて 種目:行 列名:列 金額:値:先頭 とします TRANSFORM First(google.金額) AS 金額の先頭 SELECT google.種目, google.金額 AS 合計 FROM google GROUP BY google.種目, google.金額 PIVOT "年月" & DCount("*","google","年月>=" & [年月] & " and 種目='" & [種目] & "'"); 種目 合計 年月1 年月2 年月3 AA 1000 1000 1000 1000 BB 1000 1000 1000 CC 1000 1000 googleはテーブル名です
- O_cyan
- ベストアンサー率59% (745/1260)
DBに何を使用しているか不明ですが・・ TRANSFORM Sum(テーブル名.金額) AS 金額合計 SELECT テーブル名.種目, Sum(テーブル名.金額) AS [合計]FROM テーブル名 WHERE (((テーブル名.年月) Between "200501" And "200503")) GROUP BY テーブル名.種目 PIVOT テーブル名.年月; ではどうでしょうか。 テーブル名やフィールドタイプ等は不明なので変更してください。
- OsieteG00
- ベストアンサー率35% (777/2173)
横方向への繰り返しはデータベースの正規化の流れに反するものですから、単一のSQLで書くことは難しいかと。