如何查询具有按日期分组的不同列值的行

时间:2016-05-31 08:25:11

标签: sql sql-server

我有一个查询根据列值计算(使用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的所有内容。

如果需要进一步说明,请告诉我。

感谢。

2 个答案:

答案 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