在没有游标或临时表的情况下跨多个列聚合数量

时间:2011-02-18 10:44:15

标签: sql count aggregate

如果我有一个包含两列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

3 个答案:

答案 0 :(得分:2)

SELECT ColumnA, COUNT(*) as Times
FROM (
  SELECT ColumnA FROM ATable
  UNION ALL
  SELECT ColumnB FROM ATable) Joined
GROUP BY ColumnA

大多数DBMS要求您为派生表

设置别名

答案 1 :(得分:1)

SELECT x, COUNT(*)
   FROM (SELECT ColumnA AS x FROM t
         UNION ALL
         SELECT ColumnB FROM t)
  GROUP BY x

答案 2 :(得分:0)

你不是说DBMS。如果使用SQL Server,您可以使用UNPIVOT来避免两次扫描表。

SELECT car, COUNT(*)
FROM YourTable
UNPIVOT (car FOR col in (ColumnA, ColumnB)) u 
GROUP BY car

根据您拥有的索引,这可能比UNION ALL方法效率更高或更低(如果ColumnAColumnB同时被编入索引,则UNION ALL查询计划可以在2个索引上进行合并连接并将其提供给聚合运算符,从而无需对UNPIVOT计划需要的数据进行排序)