sql - 从日期字段中获取不同的计数
问题描述
我有一段代码正在寻找小桶的不同数量,标记的不同小桶的数量和未标记的小桶的数量,到目前为止我所拥有的是:
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
它正确地返回了桶的不同计数,但标记和未标记的数字不正确,我只能假设它,因为它正在计算重复的桶。任何人都可以建议我如何解决这个问题或只计算不同的小桶吗?
解决方案
您想要使用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()
一周和一周,特别是因为您不是从一年中选择数据。 - 仅对字符串和日期常量使用单引号。不要将它们用于列别名;这可能导致难以调试的错误。
推荐阅读
- android - 从 crashlytics 获取通知
- javascript - 如何将常量字符串值包含到缩减值(Crossfilter 和 Reductio)
- jdbc - SQuirreL (SQL) 无法加载 IllegalStateException
- scala - 如何测试是否调用了 akka-streams sink?
- ios - Xamarin iOS - HomeKit 集成
- reactjs - 如何在 API 的 POST 请求正文中发送数组和布尔数据
- java - java中远程主机强行关闭现有连接如何处理?
- sql - 从先前的值中减去值,但有异常
- javascript - 如何使用角度将服务功能数据返回到组件?
- python - 如何通过放置“-”来抓取不存在的值?