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