2011-04-27 5 views
0

막대 그래프 RDLC로 덤프하는 쿼리가 있습니다. 쿼리가 모든 어려운 일을하고 싶습니다. 지금 내 쿼리는 다음과 같습니다.SQL에서 0 개의 항목이있는 사용자 지정 그룹을 반환합니다.

SELECT id, 
     CASE 
     WHEN a.sc < 50 THEN '1: Less than 50' 
     WHEN a.sc >= 50 
       AND a.sc < 100 THEN '2: 50 - 100' 
     WHEN a.sc >= 100 
       AND a.sc < 150 THEN '3: 100 - 150' 
     WHEN a.sc >= 150 
       AND a.sc < 200 THEN '4: 150 - 200' 
     WHEN a.sc >= 200 
       AND a.sc < 250 THEN '5: 200 - 250' 
     WHEN a.sc >= 250 THEN '6: Greater than 250' 
     ELSE '7: Unable to calculate' 
     END AS [range] 
FROM (SOME_SUB_QUERY) AS a 
ORDER BY [range] 

사용자 정의 된 그룹화가 있습니다. 샘플 결과 집합은 다음과 같습니다.

[ID]  [range] 
18  4: 150 - 200 
1237  6: Greater than 250 
665  7: Unable to calculate 
121  7: Unable to calculate 

내 RDLC는 결과를 범위별로 그룹화 한 다음 막대 그래프를 만듭니다. 문제는 그룹에 항목이 없으면 막대 그래프에 그룹이 누락되어 있다는 것입니다.

그래프는 항상 모든 그룹이 있도록 내가 쿼리를 싶습니다 위의 결과는 다음을 반환 감안할 때 : 나는 다른 쿼리에서 쿼리를 포장 할 필요가 있으리라 믿고있어

[count]  [range] 
0   1: Less than 50 
0   2: 50 - 100 
0   3: 100 - 150 
1   4: 150 - 200 
0   5: 200 - 250 
1   6: Greater than 250 
2   7: Unable to calculate 

을 그 그룹에 의해 수행하고 빈 그룹을 추가하지만 어떻게 작동하게 해야할지 모르겠다.

+0

인가가? 그렇다면 어떤 버전입니까? – Thomas

+0

SQL Server 2008 – William

답변

1

그 SC를 정수 가정이 SQL 서버가

Select Ranges.Name 
    , Count(Z.SomeNonNullableCol) 
From (
     Select '1: Less than 50' As Name, 0 As Min, 49 As Max 
     Union All Select '2: 50 - 100', 50, 99 
     Union All Select '3: 100 - 150', 100, 149 
     Union All Select '4: 150 - 200', 150, 199 
     Union All Select '5: 200 - 250', 200, 259 
     Union All Select '6: Greater than 250', 250, 2147483647 
     Union All Select '7: Unable to calculate', -2147483648, -1 
     ) As Ranges 
    Left Join (Some Subquery) As Z 
     On Z.SC Between Ranges.Min And Ranges.Max 
      Or (Z.SC Is Null And Ranges.Max = -1) 
Group By Ranges.Name 
+0

제 생각에 문제는'a.sc <50' 값이 없으면 보고서에 "range"가 나타나지 않을 것이라고 생각합니다. –

+0

@Conrad Fix - 알겠습니다. 예, 열거 된 그룹이 필요하며 데이터에 남아 있습니다. – Thomas

+0

@Conrad Frix - 헤드 감사합니다. 나는 내 대답을 고쳐주고 +1을 주었다. – Thomas

3

시도해 볼 수 있습니다. 이렇게하면 left join에 가상 조회를 만들 수 있습니다. 그런 다음 rtext로 그룹화하고 RDLC에서의 결과를 계산할 수 있습니다.

당신이 PIVOT 또는 CTE 할 수있는 지원 DB 경우

그것을 청소기

SELECT id, 
     CASE 
     WHEN a.sc < 50 THEN '1: Less than 50' 
     WHEN a.sc >= 50 
       AND a.sc < 100 THEN '2: 50 - 100' 
     WHEN a.sc >= 100 
       AND a.sc < 150 THEN '3: 100 - 150' 
     WHEN a.sc >= 150 
       AND a.sc < 200 THEN '4: 150 - 200' 
     WHEN a.sc >= 200 
       AND a.sc < 250 THEN '5: 200 - 250' 
     WHEN a.sc >= 250 THEN '6: Greater than 250' 
     ELSE '7: Unable to calculate' 
     END AS [range] 
FROM (SELECT '1: Less than 50' AS rtext 
     UNION 
     SELECT '2: 50 - 100' 
     UNION 
     SELECT '3: 100 - 150' 
     UNION 
     SELECT '4: 150 - 200' 
     UNION 
     SELECT '5: 200 - 250' 
     UNION 
     SELECT '6: Greater than 250' 
     UNION 
     SELECT '7: Unable to calculate') range 
     LEFT JOIN some_sub_query AS a 
     ON range.rtext = (CASE 
           WHEN a.sc < 50 THEN '1: Less than 50' 
           WHEN a.sc >= 50 
            AND a.sc < 100 THEN '2: 50 - 100' 
           WHEN a.sc >= 100 
            AND a.sc < 150 THEN '3: 100 - 150' 
           WHEN a.sc >= 150 
            AND a.sc < 200 THEN '4: 150 - 200' 
           WHEN a.sc >= 200 
            AND a.sc < 250 THEN '5: 200 - 250' 
           WHEN a.sc >= 250 THEN '6: Greater than 250' 
           ELSE '7: Unable to calculate' 
          END) 
ORDER BY [range] 
+0

응답 해 주셔서 감사합니다. 조금 간결하기 때문에 나는 다른 하나와 함께 갔다. – William

관련 문제