我必须计算各种SQL分析,最后将它们存储为键值。
例如
Select col1, col2, sum(col3),
count(col4)
From Table
Group by col1,col2
结果
Col1 | col2 | sum(col3) | count(col4)
X | Y | 5 | 10
但我想要格式为
的结果Key | Value
-----------------------------+------
Concat ( col1,col2, "sum") | 5
Concat (col1,col2, " count") | 10
有人可以帮助我。
由于
答案 0 :(得分:2)
使用else if
运算符,下面是您想要的简化版本。
UNION
修改强> 您也可以计算一次,稍后再使用它以获得更好的性能。
select CAST('Concat ( col1,col2, "sum")' AS VARCHAR(50)) Key, value
from
(
Select col1, col2, sum(col3) [value]
From Table
Group by col1,col2
)A
UNION ALL
select CAST('Concat (col1,col2, " count")' AS VARCHAR(50)), value
from
(
Select col1, col2, count(col4) [value]
From Table
Group by col1,col2
)B
答案 1 :(得分:2)
您需要执行UNPIVOT
。 Here is关于此主题的众多文章之一。
正如您所说,UNION ALL
需要多次运行查询。
这是在计算聚合值时只执行一次的一种可能方法。 See also SQL Fiddle
示例数据
DECLARE @T TABLE(col1 varchar(50), col2 varchar(50), col3 int, col4 int);
INSERT INTO @T(col1, col2, col3, col4) VALUES
('X', 'Y', 1, 10),
('X', 'Y', 2, 20),
('X', 'Y', 3, 30),
('X', 'Y', 4, 40),
('X', 'Y', 5, 50),
('A', 'B', 1, 10),
('A', 'B', 2, 20),
('A', 'B', 3, 30);
SELECT
col1
,col2
,SUM(col3) AS SumCol3
,COUNT(col4) AS CountCol4
FROM @T
GROUP BY col1, col2;
简单分组的结果
col1 col2 SumCol3 CountCol4
A B 6 3
X Y 15 5
分组,然后是UNPIVOT结果,方法是加入包含两行(sum, count)
的表格。
WITH
CTE
AS
(
SELECT
col1
,col2
,SUM(col3) AS SumCol3
,COUNT(col4) AS CountCol4
FROM @T
GROUP BY col1, col2
)
,FunctionNames
AS
(
SELECT ID, FunctionName
FROM (VALUES (1, 'sum'),(2, 'count') )AS t(ID, FunctionName)
)
SELECT
CTE.col1 + '_' + CTE.col2 + '_' + FunctionNames.FunctionName AS KeyName
,CASE
WHEN FunctionNames.ID = 1 THEN CTE.SumCol3
WHEN FunctionNames.ID = 2 THEN CTE.CountCol4
END AS Value
FROM
CTE
CROSS JOIN FunctionNames
ORDER BY
CTE.col1
,CTE.col2
,FunctionNames.ID;
最终结果集
KeyName Value
A_B_sum 6
A_B_count 3
X_Y_sum 15
X_Y_count 5
您可以在计划中看到主表@T
已扫描并仅排序一次,而该汇总仅计算一次。
使用UNION ALL
使用UNION ALL
的查询产生相同的结果(排序略有不同),但您可以在执行计划中看到主表已被扫描并排序两次。
SELECT
col1 + '_' + col2 + '_sum' AS KeyName
,SUM(col3) AS Value
FROM @T
GROUP BY col1, col2
UNION ALL
SELECT
col1 + '_' + col2 + '_count' AS KeyName
,COUNT(col4) AS Value
FROM @T
GROUP BY col1, col2
ORDER BY KeyName;