查询以选择该月的周末和公众假期的月份和月份

时间:2012-05-30 05:51:26

标签: sql tsql sql-server-2005

我的数据库表假期包括字段广告Holidaydate-> datetime,WeekendHoliday-> bit,PublicHoliday-> bit 我想要特定月份的周末假期和公共假期。

我的表值为(示例)

Holidaydate       WeekendHoliday       PublicHoliday 
-----------       --------------       -------------
4/02/2012             true                 false
4/20/2012             true                 false
5/3/2012              true                 False
5/30/2012             false                true
4/05/2013             false                true   

所以现在输出应该是这样的:

year      Month   count(weekend)   count(public)
----      -----   --------------   -------------
2012      April      2               0
2012      May        1               1
2013      April      0               1

3 个答案:

答案 0 :(得分:1)

我强烈建议您使用calendar table进行此类查询。

答案 1 :(得分:1)

     SELECT year(holidaydate),month(holidaydate), 
            sum(case Weekend when true then 1 else 0 end) wkEnd, 
            sum(case PublicHoliday when true then 1 else 0 end) pubHol
      FROM Holiday 
      GROUP BY year(holidaydate),month(holidaydate)

我没有可用的SQL服务器。这是在mysql上测试的。这里的年份和月份是返回日期和月份的函数。 CASE 的语法在数据库中应该相同。

答案 2 :(得分:1)

以下是您可以aggregate数据的一种方式:

WITH partitioned AS (
  SELECT
    MonthDate = DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0),
    WeekendHoliday,
    PublicHoliday
  FROM Holiday
)
SELECT
  Year           = YEAR(MonthDate),
  Month          = DATENAME(MONTH, MonthDate),
  Weekends       = COUNT(NULLIF(WeekendHoliday, 'false')),
  PublicHolidays = COUNT(NULLIF(PublicHoliday , 'false'))
FROM partitioned
GROUP BY
  MonthDate

partitioned CTE replaces every date与同月的第一天,然后该值用于groupingderiving years以及{{3}来自。每个month names将每个'false'0)值转换为NULL,以便相应的NULLIF()省略它。因此,只计算'true'1)值。