2012-05-30 3 views
0

내 데이터베이스 테이블 휴일에는 필드 광고가 포함됩니다. Holidaydate-> datetime, WeekendHoliday-> bit, PublicHoliday-> bit weekendholiday와 publicholiday의 nos도 필요합니다. 특정 달 년.그 달의 주말과 공휴일과 달을 선택하는 쿼리

내 테이블 값은

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 월에 공휴일을 계산합니다 또한 주말 (필드)의 값이 참이면 참인 경우 그렇지 않으면 공공의 가치 (필드)가 참이면 카운트 .... – vaishali

+0

SQL 서버에 '부울'데이터 유형이 없습니다. '비트'를 의미합니까? 그리고 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에서 테스트되었다. 여기서 연도와 월은 년과 월을 반환하는 함수입니다. 사례 코드의 구문은 데이터베이스에서 동일해야합니다.

+0

이것은 'case weekend true'로 인해 mssal에서 작동하지 않습니다. 'true'가 'case weekend'로 바뀌면 또한 count가 1과 0을 모두 계산합니다. 'else 0'을 sum으로 바꾸거나 제거하십시오. –

+0

@ t- clausen.dk * sum *을 가리키는 Tx. –

1

가 난 강력하게 쿼리 같은 종류의 calendar table를 사용하는 것이 좋습니다.

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) 값만 계산됩니다.

관련 문제