2013-02-04 26 views
1

我有一種情況,我需要根據某個列值 (如下所示)對申請人進行分組,並查找該組的計數。 當前查詢只返回那些數量大於0的列。檢查病例報告中所有組的檢查數

應該對查詢做些什麼修改才能顯示所有組及其計數爲零?

查詢:

select Applicant_info.range as [Income Range], count(*) as [Total Students],order_number = 
      CASE range 
      WHEN 'Did not specify' THEN '1' 
      WHEN '0-25000' THEN '2' 
      WHEN '25001-50000' THEN '3' 
      WHEN '50001-75000' THEN '4' 
      WHEN '75001-100000' THEN '5' 
      WHEN '100001-200000' THEN '6' 
      WHEN '200000 and Above' THEN '7' 
      END 
    from (
     select case 
     when Annual_Income is null or Annual_Income = '' then 'Did not specify' 
     when Annual_Income between 0 and 25000 then '0-25000' 
     when Annual_Income between 25001 and 50000 then '25001-50000' 
     when Annual_Income between 50001 and 75000 then '50001-75000' 
     when Annual_Income between 75001 and 100000 then '75001-100000' 
     when Annual_Income between 100001 and 200000 then '100001-200000' 
     when Annual_Income > 200000 then '200000 and Above' 
     end as range 
     from Applicant_info)Applicant_info 
    group by Applicant_info.range 
    order by order_number 

回答

2

使用獨立CASE表達爲每一個這樣的:

Select 
    range as [Income Range], 
    SUM(CASE when Annual_Income is null or Annual_Income = '' then END) AS 'Did not specify', 
    SUM(CASE when Annual_Income between 0 and 25000 then 1 ELSE 0 END) AS '0-25000', 
    SUM(CASE when Annual_Income between 25001 and 50000 then 1 ELSE 0 END) AS '25001-50000', 
    SUM(CASE when Annual_Income between 50001 and 75000 then 1 ELSE 0END) AS '50001-75000', 
    SUM(CASE when Annual_Income between 75001 and 100000 then 1 ELSE 0 END) AS '75001-100000', 
    SUM(CASE when Annual_Income between 100001 and 200000 then 1 ELSE 0END) AS '100001-200000', 
    SUM(CASE when Annual_Income > 200000 then 1 ELSE 0 END) AS '200000 and Above' 
from Applicant_info 
GROUP BY range; 

注意的是:SUM函數實際上是一個計數,因爲它總結0或1.

+0

@Shah - 你是否有錯誤,如果是的話,編輯你的問題,並在那裏添加它們或在這裏留言。 –

+0

是的範圍造成的問題,在評論它後,它工作正常 – Shah

1

您可以使用外連接和查找表來確保所有範圍都包含在內如果計數爲零。

SELECT C.[Range], COUNT(B.[Income_Band]) AS [Count] 
FROM Applicant_info 
CROSS APPLY 
(
    SELECT 
     CASE 
      WHEN Annual_Income IS NULL OR ISNUMERIC(Annual_Income) = 0 THEN 1 
      WHEN Annual_Income > 200000 THEN 7 
      WHEN Annual_Income > 100000 THEN 6 
      WHEN Annual_Income > 75000 THEN 5 
      WHEN Annual_Income > 50000 THEN 4 
      WHEN Annual_Income > 25000 THEN 3 
      WHEN Annual_Income >= 0 THEN 2 
      ELSE 1 
     END AS [Income_Band] 
) B 
RIGHT JOIN 
(
    SELECT 1 AS [Income_Band], 'Did not specify' AS [Range] 
    UNION SELECT 2, '0-25000' 
    UNION ALL SELECT 3, '25001-50000' 
    UNION ALL SELECT 4, '50001-75000' 
    UNION ALL SELECT 5, '75001-100000' 
    UNION ALL SELECT 6, '100001-200000' 
    UNION ALL SELECT 7, '200000 and Above' 
) C 
    ON C.[Income_Band] = B.[Income_Band] 
GROUP BY C.[Range], C.[Income_Band] 
ORDER BY C.[Income_Band]