2016-10-14 1 views
1

나는 평균 휴가철 및 평균 sickleaveHours를 가진 년의 제 3 란을 얻는 것을 시도하고있다.년을 그룹화하는 방법?

SELECT AVG(VacationHours) AS 'Vacation Hours', AVG(SickLeaveHours) AS 'Sick Leave Hours' 
FROM HumanResources.employee 
WHERE (YEAR(BirthDate) BETWEEN '1960' AND '1969') 
GROUP BY BirthDate 
UNION 
SELECT AVG(VacationHours), AVG(SickLeaveHours) 
FROM HumanResources.employee 
WHERE YEAR(BirthDate) BETWEEN '1970' AND '1979' 
GROUP BY BirthDate 
UNION 
SELECT AVG(VacationHours), AVG(SickLeaveHours) 
FROM HumanResources.employee 
WHERE YEAR(BirthDate) BETWEEN '1980' AND '1989' 
GROUP BY BirthDate 

OutPut 
vacation sick 
45  42 
50  45 
55  47 

평균 휴가 및 병가 시간을 얻고 있지만 그 평균이 속한 연도를 나타내는 세 번째 열이 필요합니다. 나는 그룹별로 해봤지만 내게 일년 내내주는거야.

이 출력을 찾고 있습니다.

vacation sick BirthDate 
45  42 1960-1969 
50  45 1970-1979 
55  47 1980-1989 

답변

2

너무 화려하지 않아도됩니다.

SELECT AVG(VacationHours) AS 'Vacation Hours', AVG(SickLeaveHours) AS 'Sick Leave Hours', 
    '1960-1969' AS BirthDate 
FROM HumanResources.employee 
WHERE (YEAR(BirthDate) BETWEEN '1960' AND '1969') 
GROUP BY BirthDate 
UNION 
SELECT AVG(VacationHours), AVG(SickLeaveHours), '1970-1979' 
FROM HumanResources.employee 
WHERE YEAR(BirthDate) BETWEEN '1970' AND '1979' 
GROUP BY BirthDate 
UNION 
SELECT AVG(VacationHours), AVG(SickLeaveHours), '1980-1989' 
FROM HumanResources.employee 
WHERE YEAR(BirthDate) BETWEEN '1980' AND '1989' 
GROUP BY BirthDate 
1
SELECT 
AVG(CASE WHEN (YEAR(BirthDate) BETWEEN '1960' AND '1969' THEN VacationHours ELSE 0 END)) AS 'Vacation Hours', 
AVG(CASE WHEN (YEAR(BirthDate) BETWEEN '1960' AND '1969' THEN SickLeaveHours ELSE 0 END)) AS 'Sick Leave Hours', 
'1960-1969' AS 'BirthDate' 
FROM HumarResources.employee 
UNION 
SELECT 
AVG(CASE WHEN (YEAR(BirthDate) BETWEEN '1970' AND '1979' THEN VacationHours ELSE 0 END)) AS 'Vacation Hours', 
AVG(CASE WHEN (YEAR(BirthDate) BETWEEN '1970' AND '1979' THEN SickLeaveHours ELSE 0 END)) AS 'Sick Leave Hours', 
'1970-1979' AS 'BirthDate' 
FROM HumarResources.employee 
SELECT 
AVG(CASE WHEN (YEAR(BirthDate) BETWEEN '1980' AND '1989' THEN VacationHours ELSE 0 END)) AS 'Vacation Hours', 
AVG(CASE WHEN (YEAR(BirthDate) BETWEEN '1980' AND '1989' THEN SickLeaveHours ELSE 0 END)) AS 'Sick Leave Hours', 
'1980-1989' AS 'BirthDate' 
FROM HumarResources.employee 

당신이

0

난 당신이 CONCAT와 MIN, MAX를 사용할 수 있다고 생각하려고한다 : 단지 명시 적으로, 각각 자신의 날짜 범위를 지정, 그래서 당신은 당신이 가입하고 별도의 세 가지 질문이 대신 아래와 같이 입력하십시오 :

SELECT AVG(VacationHours) AS 'Vacation Hours', 
    AVG(SickLeaveHours) AS 'Sick Leave Hours', 
    CONCAT(MIN(YEAR(BirthDate)), '-', MAX(YEAR(BirthDate))) AS BirthDate 
FROM HumanResources.employee 
WHERE (YEAR(BirthDate) BETWEEN '1960' AND '1969') 
GROUP BY BirthDate 
UNION 
SELECT AVG(VacationHours), 
    AVG(SickLeaveHours), 
    CONCAT(MIN(YEAR(BirthDate)), '-', MAX(YEAR(BirthDate))) AS BirthDate 
FROM HumanResources.employee 
WHERE YEAR(BirthDate) BETWEEN '1970' AND '1979' 
GROUP BY BirthDate 
UNION 
SELECT AVG(VacationHours), 
    AVG(SickLeaveHours), 
    CONCAT(MIN(YEAR(BirthDate)), '-', MAX(YEAR(BirthDate))) AS BirthDate 
FROM HumanResources.employee 
WHERE YEAR(BirthDate) BETWEEN '1980' AND '1989' 
GROUP BY BirthDate