【问题标题】:Conditional count using CASE WHEN使用 CASE WHEN 的条件计数
【发布时间】:2016-05-24 11:08:58
【问题描述】:

我有如下表

CID ITEM    FLAG
C_1 ITEM_1  0
C_1 ITEM_2  1
C_1 ITEM_2  1
C_1 ITEM_2  0
C_2 ITEM_2  0
C_3 ITEM_2  1
C_3 ITEM_2  1
C_3 ITEM_3  1

我想制作这样的表格

CID UNIQ_CNT_OF_CID
ITEM_1  0
ITEM_2  2
ITEM_3  1

关键是 - 我想为相同的 CID 数一次 CID。

我试过了,

SELECT  ITEM, CID,
      case when FLAG =1 then count(distinct CID)  else 0 end  as COUNTER 
      from T  
      group by ITEM

请帮忙!!

【问题讨论】:

    标签: sql sum conditional


    【解决方案1】:

    我想我理解你的问题是正确的,如果没有让我知道。

    您可以使用窗口函数来完成此操作:

    SELECT
    ITEM,
    COUNT(DISTINCT CID) OVER (PARTITION BY ITEM) AS UNIQ_CNT_OF_CID
    FROM T
    

    这将为您提供相同数量的行,因此如果您希望从中获得唯一性,您可以使用 CTE 或子查询,如下所示:

    SELECT DISTINCT
    ITEM, UNIQ_CNT_OF_CID
    FROM
        (
        SELECT
        ITEM,
        COUNT(DISTINCT CID) OVER (PARTITION BY ITEM) AS UNIQ_CNT_OF_CID
        FROM T
        ) final
    

    【讨论】:

      【解决方案2】:

      你很亲密。需要指出的 2 项:

      1. group by 必须在选择中包含相同的字段(不在聚合函数中)。因为不需要按CID 分组,所以应该从选择中删除。
      2. 您可以将CASE 用于不在 group by 但在聚合函数中的字段。

      所以修改你的 SQL 现在看起来像这样:

      SELECT ITEM,
          -- The CID is used inside the case, inside the count function.
          -- NULL will not be included in the count
          COUNT(DISTINCT CASE WHEN FLAG = 1 THEN CID ELSE NULL END) AS COUNTER 
          from T 
          group by ITEM
      

      结果:

      【讨论】:

      • NULL will not be included in the count 我认为会更准确一些,但做得很好。
      • @Used_By_Already 啊,感谢您指出这一点:) 修改它。
      • 如何在计数中包含 null?
      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 2019-02-01
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 2017-04-20
      • 2023-02-04
      • 2021-11-04
      相关资源
      最近更新 更多