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中的字段,但在聚合函数中使用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中的字段,但在聚合函数中使用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?