是否可以按月分组的Sum值?

时间:2013-06-12 14:32:27

标签: sql sql-server database group-by sum

我有一个SQL Server表,结构如下:

Table name : calendar. 

专栏:

Calendar Date (smalldatetime)
Working Day (bit)

日历日期包含所有日期,格式为yyyy-mm-dd。 工作日意味着我有工作,如果是1,如果是周末或假日,则标记为0。

我想要检索的内容:

Month      No Working Days   Year
------------------------------------
January    22                2011
February   20                2011
March      22                2011
...
December   10                2011
January    15                2012

所有信息都在那里,但我不知道如何编写这样的查询,但我认为它的结构与此类似,并且引入了一些花哨的日期时间函数。

SELECT Sum(Working Day)
       GROUP BY (Not a clue)

4 个答案:

答案 0 :(得分:2)

据推测,您有兴趣查找每个月每个月的工作日,并报告当天的天数。这会给你:

SELECT YEAR([Calendar Date]) As [YEAR],
       Month([Calendar Date]) As [Month],
       SUM([Working Day] As [Working Days]
FROM [Calendar]
GROUP BY YEAR([Calendar Date]), 
         Month([Calendar Date]) 

答案 1 :(得分:0)

您的查询应如下所示:

SELECT Sum(Working Day)
WHERE Working Day = 1
   GROUP BY MONTH(calenderDate)

根据您的要求,这将按月分组。 如需更多日期时间功能,您可以查看this link

答案 2 :(得分:0)

这样的事情应该有效:

SELECT  DATENAME(month, [Calendar Date]) 'Month',
    COUNT(1) 'No Working Days', 
    YEAR([Calendar Date]) 'Year'
FROM YourTable
WHERE [Working Day] = 1
GROUP BY DATENAME(month, [Calendar Date]), YEAR([Calendar Date])

根据您的数据和您想要的结果,如果一个月没有任何工作日,此查询将不会返回该月的任何结果。相反,您可以使用CASE删除WHERE条件来使用类似的内容:

SELECT  DATENAME(month, [Calendar Date]) 'Month',
    COUNT(CASE WHEN [Working Day] = 1 THEN 1 END) 'No Working Days', 
    YEAR([Calendar Date]) 'Year'
FROM YourTable
GROUP BY DATENAME(month, [Calendar Date]), YEAR([Calendar Date])

您可能根本不需要case语句 - 取决于您的表是否允许您的位字段NULL。如果它不允许NULLs,您可以使用SUM([Working Day]),因为它将总和为0和1。

答案 3 :(得分:0)

尝试这个...它与上面的大多数答案几乎相同,但是按

添加顺序
SELECT YEAR(calendar_date) As [Year],
MONTH(calendar_date) As [Month],
SUM(working_day) As Working_Days
FROM [calendar]
GROUP BY YEAR(calendar_date) MONTH(calendar_date]) 
ORDER BY [Year], [Month]