【问题标题】:sql server, aggregate (count) on many columns in tablesql server,在表中的许多列上聚合(计数)
【发布时间】:2015-05-20 07:26:48
【问题描述】:

我有一个表格,我已简化为下面的表格。它实际上扩展到 Type60

号码 |类型1 |类型2 |类型3 |类型4 -------------------------------------------------- ---- 1 | 1 | 1 | 1 | 0 2 | 1 | 1 | 1 | 0 3 | 1 | 1 | 1 | 0 4 | 0 | 2 | 0 | 1 5 | 0 | 2 | 1 | 0 6 | 0 | 2 | 0 | 1 7 | 1 | 1 | 1 | 0 8 | 1 | 1 | 0 | 1 9 | 1 | 2 | 1 | 0 10 | 0 | 2 | 0 | 1

我想要的输出如下(扩展为 Name60)

姓名 |价值 |计数值 ---------------------------------- 姓名1 | 0 | 4 姓名1 | 1 | 6 姓名2 | 1 | 5 姓名2 | 2 | 5 姓名3 | 0 | 6 姓名3 | 1 | 4 姓名4 | 0 | 4 姓名4 | 1 | 6

为了到达那里,我一直在做:

选择“名称1”作为名称、类型1、计数(数字) 从表 1 按 T​​ype1 分组 联盟 选择“名称2”作为名称、类型2、计数(数字) 从表 1 按 T​​ype2 分组 联盟 选择“名称3”作为名称、类型3、计数(数字) 从表 1 按 T​​ype3 分组 联盟 选择“名称4”作为名称、类型4、计数(数字) 从表 1 按 T​​ype4 分组

最多 Name60 等

这需要一段时间才能运行,

有没有人知道做同样事情的更有效(更快)的方法?

谢谢,加里

【问题讨论】:

标签: sql-server


【解决方案1】:

你可以试试 UNPIVOT。

SELECT Name, [values] AS Value, Count(*) AS CountOfValue
FROM
(
    SELECT REPLACE([Type], 'Type', 'Name') AS Name, [values]
    FROM #testPivot
    UNPIVOT ([values] FOR [type] IN 
            (Type1, Type2, Type3, Type4) -- ETC to Type60
    ) AS unpvt
) AS test
GROUP BY Name, [values]
ORDER BY Name, Value

您仍然需要在 UNPIVOT 中放入所有 Type1 到 Type 60。查看PIVOT and UNPIVOT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-19
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 2010-11-17
    • 1970-01-01
    相关资源
    最近更新 更多