2013-06-12 40 views
0

我有一个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) 

回答

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]) 
+0

我喜欢这个答案,但大家的是正确的。多谢你们 ! –

0

您的查询看起来应该像这样:

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

这将根据您的要求逐月分组。 更多日期时间函数你可以检查出this link

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]) 

根据您的数据和预期的结果,如果一个月没有任何工作日,这个查询赢得” t返回该月的任何结果。相反,你可以使用类似这样与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相加。

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]