如果我有一个包含两列A和B的表,并且希望计算一个项在两列中出现的次数,是否有办法这样做而不使用游标或临时表?在没有游标或临时表的情况下跨多个列汇总数量
Ex:
Column A Column B
BMW Ford
Jaguar BMW
Mercedes Lexus
Chevrolet Jaguar
BMW Ford
我想结果是:
BMW 3
Jaguar 2
Mercedes 1
Chevrolet 1
Ford 2
Lexus 1
如果我有一个包含两列A和B的表,并且希望计算一个项在两列中出现的次数,是否有办法这样做而不使用游标或临时表?在没有游标或临时表的情况下跨多个列汇总数量
Ex:
Column A Column B
BMW Ford
Jaguar BMW
Mercedes Lexus
Chevrolet Jaguar
BMW Ford
我想结果是:
BMW 3
Jaguar 2
Mercedes 1
Chevrolet 1
Ford 2
Lexus 1
SELECT x, COUNT(*)
FROM (SELECT ColumnA AS x FROM t
UNION ALL
SELECT ColumnB FROM t)
GROUP BY x
SELECT ColumnA, COUNT(*) as Times
FROM (
SELECT ColumnA FROM ATable
UNION ALL
SELECT ColumnB FROM ATable) Joined
GROUP BY ColumnA
大多数DBMS要求您别名派生表
你不说DBMS。如果SQL Server可以使用UNPIVOT
来避免两次扫描表。
SELECT car, COUNT(*)
FROM YourTable
UNPIVOT (car FOR col in (ColumnA, ColumnB)) u
GROUP BY car
取决于你有这个什么指标可能是因为存在比UNION ALL
办法(或多或少有效的,如果这两个ColumnA
和ColumnB
被索引的UNION ALL
查询计划可以做一个合并连接在2个索引和哺养成聚合运算符避免了需要对UNPIVOT
计划需要的数据进行分类)