2012-05-30 105 views
0

我的数据库表假期包含字段的广告Holidaydate-> datetime,WeekendHoliday-> bit,PublicHoliday-> 我想要周末假日的nos和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 
+0

您需要此问题的更多详细信息。你期望的输出中的3和5代表什么,如果是的话,是什么?请多解释一下。根据你的问题'选择'4月'作为月份,'3'作为周末,'5'作为公共'将满足这个问题。 – RThomas

+0

雅3正在计算4月份的周末假期数,5代表4月份的公休日计数,如果Weekend(场)的值为真,那么计算其他值不计算,如果公开的值(字段)是真的,然后计数.... – vaishali

+0

SQL Server中没有'boolean'数据类型,你的意思是'位'吗?您对3和5的评论与您所展示的数据完全不符你说3是4月份的周末假期数,但你的数据显示只有2。你需要更准确地解释你的逻辑。你显示的两个结果集中哪一个你真的想要?第一个是3列还是第二个是4列?或两者? – Pondlife

回答

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的语法在数据库中应该是相同的。

+0

这将不会在mssal中工作,因为'case周末时真'替换为'case周末时'true''计数也会计入1和0.替换为sum或者删除'else 0' –

+0

@ t- clausen.dk Tx用于指出* sum *。 –

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 

partitionedCTEreplaces every date与第一同月,然后该值用于从groupingderiving yearsmonth names。每个NULLIF()将每'false'0)值转换为NULL,因此相应的COUNT()将其忽略。结果,只有'true'1)值被计数。

相关问题