■101321 / inTopicNo.2) |
Re[1]: Oracleでの集計方法 |
□投稿者/ 魔界の仮面弁士 (3556回)-(2023/02/03(Fri) 18:26:03)
|
■No101318 (SITORO さん) に返信
> Oracleでの集計方法についての質問です。
残念ながら Oracle では、列方向に可変なクエリを作ることはできません。
代替策としては下記のいずれかで対応することになるでしょう。
(案1)下記のような SQL を動的に生成する。
→ 取得結果は望ましいものとなりますが、列情報は固定値的に記述していくしかありません。
他にも「PIVOT」を使う手がありますが、抽出データに合わせて決め打ちになってしまうという点では一緒です。
SELECT
"店舗コードテーブル"."店名"
, NVL(SUM(CASE "データ".ZAI_CODE WHEN '1' THEN "データ".SUURYOU END), 0) AS "木"
, NVL(SUM(CASE "データ".ZAI_CODE WHEN '2' THEN "データ".SUURYOU END), 0) AS "鉄"
, NVL(SUM(CASE "データ".ZAI_CODE WHEN '3' THEN "データ".SUURYOU END), 0) AS "プラ"
FROM
"店舗コードテーブル" CROSS JOIN "材料コードテーブル"
LEFT JOIN "データ"
ON "データ".TEN_CODE = "店舗コードテーブル".TEN_CODE
AND "データ".ZAI_CODE = "材料コードテーブル".ZAI_CODE
GROUP BY
"店舗コードテーブル"."店名"
ORDER BY
"店舗コードテーブル"."店名"
(案2)Oracle 側では行方向に並べて取得し、取得後にアプリ側で整形する方針に変更。
→ 取得結果の再整形が必要になりますが、こちらは SQL をデータに合わせて動的に構築する必要がなくなります。
※下記の場合、店舗 3 種×材料 3 種で、総計 9 レコードが取得されることになる。
SELECT
"店舗コードテーブル".TEN_CODE, "店舗コードテーブル"."店名"
, "材料コードテーブル".ZAI_CODE, "材料コードテーブル"."材料名"
, NVL(SUM(EXAMPLE.SUURYOU), 0) AS SUURYOU
FROM
"店舗コードテーブル" CROSS JOIN "材料コードテーブル"
FULL JOIN (SELECT TEN_CODE, ZAI_CODE, SUM(SUURYOU) AS SUURYOU
FROM "データ" GROUP BY TEN_CODE, ZAI_CODE) EXAMPLE
ON EXAMPLE.TEN_CODE = "店舗コードテーブル".TEN_CODE
AND EXAMPLE.ZAI_CODE = "材料コードテーブル".ZAI_CODE
GROUP BY
"店舗コードテーブル".TEN_CODE, "店舗コードテーブル"."店名"
, "材料コードテーブル".ZAI_CODE, "材料コードテーブル"."材料名"
ORDER BY
"店舗コードテーブル".TEN_CODE
, "材料コードテーブル".ZAI_CODE
もしも全店合計や材料別合計も必要なら、CUBE を併用する
http://oracle.se-free.com/dml/06_cube.html
|
|