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

4 回答 4

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]) 
于 2013-06-12T14:43:33.433 回答
0

您的查询应如下所示:

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

这将按照您的要求按月分组。有关更多日期时间功能,您可以查看此链接

于 2013-06-12T14:36:11.003 回答
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 相加。

于 2013-06-12T14:39:53.393 回答
0

试试这个......它与上面的大多数答案几乎相同,只是添加了 order by

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]
于 2013-06-13T08:58:05.167 回答