2014-01-08 2 views
0

다음 쿼리를 사용하여 저장된 모든 사용자 생년월일 (년)을 반환합니다. 본질적으로 나이를 계산하여 보고서를 생성 할 수 있다면 유용 할 것입니다. 질의가 복잡하여 집계 함수에 별칭을 할당 할 수 없기 때문에이 작업을 수행하는 방법을 이해하는 것이 매우 어렵습니다.저장된 DOB에서 추론 된 특정 연령의 사람 수를 반환하십시오.

Select 
    DateDiff(YEAR, dob, CURRENT_TIMESTAMP) - 
    CASE WHEN 
     DATEADD(year,DateDiff(YEAR, dob, CURRENT_TIMESTAMP),CURRENT_TIMESTAMP) 
     > CURRENT_TIMESTAMP 
    THEN 1 
    ELSE 0 END as ageYears 

from [database].[dbo].[users] 

내가 나이 그룹이 아닌 인스턴스를 반환 할 수 distinct 키워드를 사용하지만 방법은 내가 count 이러한 참여할 것인가?

age | numUsers 
18 | 1 
19 | 3 
20 | 7 
21 | 1 
22 | 9 
23 | 2 

답변

2

그냥 먼저 나이를 만들기 위해 CTE 또는 하위 쿼리를 사용하여, 다음의 요청에 의한 간단한 그룹은 그들을 집계하기 :

이 출력은 이상적 일 것이다

; With Ages as (
    Select 
     DateDiff(YEAR, dob, CURRENT_TIMESTAMP) - 
     CASE WHEN 
      DATEADD(year,DateDiff(YEAR, dob, CURRENT_TIMESTAMP),CURRENT_TIMESTAMP) 
      > CURRENT_TIMESTAMP 
     THEN 1 
     ELSE 0 END as ageYears 

    from [database].[dbo].[users] 
) 
SELECT ageYears,COUNT(*) as NumUsers 
FROM Ages 
GROUP BY ageYears 

대안 하위 쿼리가 필요하지 않거나 CTE는 GROUP BY 절에서 전체 복합 표현식을 반복하는 것입니다.

Select 
    DateDiff(YEAR, dob, CURRENT_TIMESTAMP) - 
    CASE WHEN 
     DATEADD(year,DateDiff(YEAR, dob, CURRENT_TIMESTAMP),CURRENT_TIMESTAMP) 
     > CURRENT_TIMESTAMP 
    THEN 1 
    ELSE 0 END as ageYears, 
    COUNT(*) as numUsers 
from [database].[dbo].[users] 
group by 
DateDiff(YEAR, dob, CURRENT_TIMESTAMP) - 
    CASE WHEN 
     DATEADD(year,DateDiff(YEAR, dob, CURRENT_TIMESTAMP),CURRENT_TIMESTAMP) 
     > CURRENT_TIMESTAMP 
    THEN 1 
    ELSE 0 END as ageYears 

개인적으로 나는 이전 버전을 선호합니다. 당신이 시도 할 수

+0

나를 때려 눕히세요. 잘 했어. –

2

,

Select X.age, sum (X.num) numUsers 
From (
Select 
    DateDiff(YEAR, dob, CURRENT_TIMESTAMP) - 
    CASE WHEN 
     DATEADD(year,DateDiff(YEAR, dob, CURRENT_TIMESTAMP),CURRENT_TIMESTAMP) 
     > CURRENT_TIMESTAMP 
    THEN 1 
    ELSE 0 END age, 
    1 num 

from [database].[dbo].[users] 
) X 
group by X.age 
1

테스트 데이터

DECLARE @T TABLE (ID INT, DOB DATE) 
INSERT INTO @T 
VALUES (1, '1940-01-01'),(2, '1940-01-01'),(3, '1985-01-01') 
,(4, '1985-01-01'),(1, '1999-01-01'),(1, '1968-01-01') 

쿼리

SELECT  DateDiff(YEAR, dob, CURRENT_TIMESTAMP) - 
    CASE WHEN 
     DATEADD(year,DateDiff(YEAR, dob, CURRENT_TIMESTAMP),CURRENT_TIMESTAMP) 
     > CURRENT_TIMESTAMP 
    THEN 1 
    ELSE 0 END AS Age , COUNT(*) AS Total 
FROM @T 
GROUP BY DateDiff(YEAR, dob, CURRENT_TIMESTAMP) - 
    CASE WHEN 
     DATEADD(year,DateDiff(YEAR, dob, CURRENT_TIMESTAMP),CURRENT_TIMESTAMP) 
     > CURRENT_TIMESTAMP 
    THEN 1 
    ELSE 0 END 

결과

╔═════╦═══════╗ 
║ Age ║ Total ║ 
╠═════╬═══════╣ 
║ 14 ║  1 ║ 
║ 28 ║  2 ║ 
║ 45 ║  1 ║ 
║ 73 ║  2 ║ 
╚═════╩═══════╝ 
관련 문제