如何在列中显示SQL聚合函数的结果?

时间:2015-07-07 04:46:26

标签: sql sql-server

我必须计算各种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

有人可以帮助我。

由于

2 个答案:

答案 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)

您需要执行UNPIVOTHere 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

unpivot

您可以在计划中看到主表@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;

union all