我的数据库表假期包括字段广告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
答案 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与同月的第一天,然后该值用于grouping和deriving years以及{{3}来自。每个month names将每个'false'
(0
)值转换为NULL
,以便相应的NULLIF()
省略它。因此,只计算'true'
(1
)值。