【问题标题】:Aggregating quantities across multiple columns without a cursor or temporary table在没有游标或临时表的情况下跨多个列聚合数量
【发布时间】:2011-02-18 10:44:15
【问题描述】:

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

【问题讨论】:

    标签: sql count aggregate


    【解决方案1】:
    SELECT ColumnA, COUNT(*) as Times
    FROM (
      SELECT ColumnA FROM ATable
      UNION ALL
      SELECT ColumnB FROM ATable) Joined
    GROUP BY ColumnA
    

    大多数 DBMS 要求您为派生表起别名

    【讨论】:

      【解决方案2】:
      SELECT x, COUNT(*)
         FROM (SELECT ColumnA AS x FROM t
               UNION ALL
               SELECT ColumnB FROM t)
        GROUP BY x
      

      【讨论】:

        【解决方案3】:

        你没有说 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 计划所需的数据进行排序)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多