首页 > 解决方案 > 从日期字段中获取不同的计数

问题描述

我有一段代码正在寻找小桶的不同数量,标记的不同小桶的数量和未标记的小桶的数量,到目前为止我所拥有的是:

with CTE as
(select UID_KEG, IS_TAGGED, movement_date
from MOVEMENT M
inner join Keg on M.UID_Keg = Keg.Unique_ID
where DATEPART(year,Movement_date) = '2019'
and UID_MOVEMENT_TYPE = 1
)
select COUNT(Distinct CTE.UID_KEG) as 'Kegs', datepart(week,movement_date) 
as 'Week number',
SUM(case when Is_Tagged = 1 then 1 end) as 'tagged',
SUM(case when Is_Tagged = 0 then 1 end) as 'untagged' 
from CTE
group by datepart(week,movement_date)
order by [Week number] asc

它正确地返回了桶的不同计数,但标记和未标记的数字不正确,我只能假设它,因为它正在计算重复的桶。任何人都可以建议我如何解决这个问题或只计算不同的小桶吗?

标签: sqltsql

解决方案


您想要使用COUNT(DISTINCT). 那将是:

SELECT COUNT(DISTINCT CTE.UID_KEG) as Kegs, 
       datepart(week, movement_date) as Week_number,
       COUNT(DISTINCT CASE WHEN Is_Tagged = 1 THEN CTE.UID_KEG END) as tagged,
       COUNT(DISTINCT(CASE WHEN Is_Tagged = 0 THEN CTE.UID_KEG END) as untagged 
FROM CTE
GROUP BY datepart(week, movement_date)
ORDER BY MIN(movement_date);

笔记:

  • 假设酒桶可以在一周内同时加标签和不加标签,加标签和未加标签的计数可能仍会超过总计数。
  • 您应该包括year()一周和一周,特别是因为您不是从一年中选择数据。
  • 仅对字符串和日期常量使用单引号。不要将它们用于列别名;这可能导致难以调试的错误。

推荐阅读