0

我的数据库表 Holiday 包括字段 ad Holidaydate->datetime 、 WeekendHoliday->bit、PublicHoliday->bit 我想要特定月份年份的周末假期和 publicholiday 的编号。

我的表值是(示例)

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
4

3 回答 3

1

我强烈建议对此类查询使用日历表。

于 2012-05-30T06:58:03.250 回答
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的语法在数据库中应该相同。

于 2012-05-30T07:09:21.717 回答
1

这是聚合数据的一种方法:

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每个日期替换为同一月份的第一天,然后该值用于分组派生年份月份名称。每个都NULLIF()将每个'false'( 0) 值转换为NULL,因此相应的COUNT()将其省略。因此,仅计算'true'( 1) 值。

于 2012-05-30T07:24:27.937 回答