【问题标题】:Grouping multiple counts with each row representing one ID将多个计数分组,每一行代表一个 ID
【发布时间】:2010-10-12 17:57:09
【问题描述】:

我有一个记录活动的表。它有一个 int 活动列,指示它是什么类型的活动,以及一个相应的 admin_id,指示哪个管理员执行了该操作。表中的每一行代表一个操作,例如,管理员将取消用户的帐户,然后将创建具有该管理员 id 和 activity=[int代表取消] 的行。我需要一种方法来选择一个结果,该结果对每个管理员的活动进行分组,以便与管理员对应的行将具有每个活动的#

结果会是这样的

admin_id | numActivated |数字取消 | numRenewed 1 1 1 2 2 1 3 0

numActivated、numCanceled 和 numRenewed 都来自每个活动的计数。

这就是原始表格的样子:

admin_id |活动 ... 1 2 1 1 1 3 1 3 2 2 2 2 2 2 2 1

(活动1:激活,2:取消,3:续订)

谢谢

【问题讨论】:

    标签: sql sql-server pivot


    【解决方案1】:

    这应该可以满足您的要求:

    select admin_id,
           sum(case when activity = 1 then 1 else 0 end) as numActivated,
           sum(case when activity = 2 then 1 else 0 end) as numCanceled,
           sum(case when activity = 3 then 1 else 0 end) as numRenewed
        from YourTable
        group by admin_id
    

    【讨论】:

      【解决方案2】:

      应该这样做:

      SELECT
          T.admin_id,
          sum(T.activate) AS numActivated,
          sum(T.canceled) AS numCanceled,
          sum(T.renew) AS numRenewed
      FROM (
          SELECT
              admin_id,
              CASE activity WHEN 1 THEN 1 ELSE 0 END AS activate,
              CASE activity WHEN 2 THEN 1 ELSE 0 END AS canceled,
              CASE activity WHEN 3 THEN 1 ELSE 0 END AS renew
          FROM Table
      ) AS T
      GROUP BY T.admin_id
      

      【讨论】:

      • 不需要子查询;永远做你能做的,一次通过。
      猜你喜欢
      • 1970-01-01
      • 2021-11-04
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多