SQLで平均、合計値を出力するとき

フラミア
2013-07-17 14:44 1980 1
SQLで平均、合計値を出力するとき
下記のようなテーブルがあったとします。

TABLE1
番号 | 名前 | 値
1 | AAA | 100
2 | BBB | 200
3 | CCC | 300

ここから、AAAとBBBの平均、合計を以下のように表示したいです。

番号 | 名前 | 値
1 | AAA | 100
2 | BBB | 200
88 | 平均 | 150
99 | 合計 | 300

この場合は以下のようにUNIONすれば作成できると思いますが、
他によい方法はないでしょうか?

SELECT 番号, 名前, 値
FROM TABLE1
WHERE (番号 = 1 OR 番号 = 2)
UNION ALL
SELECT 88 AS 番号, '平均' AS 名前, AVG(値)
FROM TABLE1
WHERE (番号 = 1 OR 番号 = 2)
UNION ALL
SELECT 99 AS 番号, '合計' AS 名前, SUM(値)
FROM TABLE1
WHERE (番号 = 1 OR 番号 = 2)
ORDER BY 番号;

上記のクエリだと、AVG, SUMをするために
同じような処理を行わなければなりませんので、
もっと効率のよい方法があれば教えてください。

コメント

2013年 07月 18日 (09:48)
こんにちは。
イノ(inno)です。
効率がいいとは言えませんが、下記のようにしてみてください。


-- 一時テーブル作成
CREATE TABLE #TempTable
(
Idx int,
DataName varchar(10),
DataValue int
)
GO

-- データ登録
INSERT INTO #TempTable
SELECT 1, 'AAA', 100 UNION ALL
SELECT 2, 'BBB', 200 UNION ALL
SELECT 3, 'CCC', 300
GO


-- データ抽出
SELECT Idx, DataName
, CASE WHEN Idx = 88 THEN AVG(DataValue)
WHEN Idx = 99 THEN SUM(DataValue)
ELSE MIN(DataValue) END DataValue
FROM
(
SELECT CASE WHEN Code = 1 THEN Idx ELSE Code END Idx
, CASE WHEN Code = 1 THEN DataName ELSE CodeType END DataName
, DataValue
FROM
(
SELECT Idx, DataName, DataValue
FROM #TempTable
WHERE Idx IN (1,2)
) A,
(
SELECT 1 Code, N'Data' CodeType UNION ALL
SELECT 88 Code, N'平均' CodeType UNION ALL
SELECT 99 Code, N'合計' CodeType
) B
) A
GROUP BY Idx, DataName
ORDER BY Idx, DataName