我有一个查询根据列值计算(使用SUM)分隔的组,然后按月分组。我认为更好的解释是分享这个概念。
考虑这个表(myTable):
Id ItemID Color CreatedDate
--------------------------------------------------
1 2 Red someDateTimeStamp
2 3 Blue someDateTimeStamp
3 4 Green someDateTimeStamp
4 5 Blue someDateTimeStamp
5 2 Red someDateTimeStamp
6 3 Purple someDateTimeStamp
7 2 Blue someDateTimeStamp
8 3 Blue someDateTimeStamp
9 3 Blue someDateTimeStamp
所以Id是主键,ItemID是外键。并不是说不明显。
我的查询:
SELECT TOP 12
DateAdd(MONTH, DATEDIFF(MONTH, 0, t.CreatedDate), 0) AS [Date],
SUM(CASE WHEN t.Color = 'Red' or t.Color = 'Green' THEN 1 ELSE 0 END) AS firstCount,
SUM(CASE WHEN t.Color = 'Blue' THEN 1 ELSE 0 END) AS secondCount
FROM
myTable t
Group By
DateAdd(MONTH, DATEDIFF(MONTH, 0, t.CreatedDate), 0)
ORDER BY
DateAdd(MONTH, DATEDIFF(MONTH, 0, t.CreatedDate), 0)
此查询对颜色进行计数,并按月将其分组为过去12个月。它工作正常并按预期计算一切,直到我意识到我不应该每月包含相同的[ItemID]。正如您所看到的,它可以在任何时间出现多次,我只需要每月计算一次。
如果上面的表值都在同一个月内,我当前的查询将返回:
Date firstCount secondCount
------------------------------------------------------
someDateStamp 3 5
它应该返回什么:
Date firstCount secondCount
------------------------------------------------------
someDateStamp 2 3
我首先想到我可以使用类似的东西:
HAVING count(t.ItemID) = 1
但显然不包括超过1的所有内容。
如果需要进一步说明,请告诉我。
感谢。
答案 0 :(得分:1)
你可以这个
1在cte。中获取不同的值。
2创建排名()
样本
;with resut as
(
select distinct ItemID,
Color,
DateAdd(MONTH, DATEDIFF(MONTH, 0, t.CreatedDate), 0) AS [Date]
from myTable t
)
SELECT TOP 12
[Date],
SUM(CASE WHEN t.Color = 'Red' or t.Color = 'Green' THEN 1 ELSE 0 END) AS firstCount,
SUM(CASE WHEN t.Color = 'Blue' THEN 1 ELSE 0 END) AS secondCount
from resut t
Group By [Date]
order by [Date]
答案 1 :(得分:0)
你可以调整mytable:
...
p + coord_cartesian(xlim = c(min(x), 300))
分组依据 t.CreatedMonth 订购 t.CreatedMonth