2012-05-30 70 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)值被計數。

相關問題