Sql 使用CASE时的条件计数

Sql 使用CASE时的条件计数,sql,sum,conditional,Sql,Sum,Conditional,我有下面这样的桌子 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,

我有下面这样的桌子

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

请帮忙

如果不告诉我,我想我正确理解了你的问题

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

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

我想我正确理解了你的问题,如果不让我知道的话

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

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项:

  • 分组依据
    必须在select中包含相同的字段(不在聚合函数中)。由于不需要按
    CID
    分组,因此应将其从选择中删除
  • 您可以将
    大小写
    用于不在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
    
    结果:


    你很接近。需要指出的2项:

  • 分组依据
    必须在select中包含相同的字段(不在聚合函数中)。由于不需要按
    CID
    分组,因此应将其从选择中删除
  • 您可以将
    大小写
    用于不在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将不包括在计数中
    我认为会更准确一点,但做得很好。_已经使用了,谢谢你指出:)修改了它。我如何才能将NULL包括在计数中?
    NULL将不包括在计数中
    我认为会更准确一点,但是做得很好。@Used By_已经用过了啊,谢谢你指出:)修改了它。我怎么能在计数中包含null?