2016-01-13 55 views
1

我正在使用此SQL Server database。我正在爲各國定義以下評論SQL Server:如何使用計數

CASE 
    WHEN density_per_sq_km > 1000 THEN 'Overpopulated' 
    WHEN density_per_sq_km > 500 THEN 'above average' 
    WHEN density_per_sq_km > 250 THEN 'average' 
    WHEN density_per_sq_km > 50 THEN 'below average' 
    ELSE 'Underpopulated' 
END as remarks 

現在我想要統計每條評論中有多少個國家/地區。我怎樣才能做到這一點?我使用下面的查詢,但它通過子句不

SELECT 
    COUNT(country) as no_of_countries, 
    CASE 
     WHEN density_per_sq_km > 1000 THEN 'Overpopulated' 
     WHEN density_per_sq_km > 500 THEN 'above average' 
     WHEN density_per_sq_km > 250 THEN 'average' 
     WHEN density_per_sq_km > 50 THEN 'below average' 
     ELSE 'Underpopulated' 
    END as remarks 
FROM 
    countries_by_population 
GROUP BY 
    remarks; 
+0

使用'COUNT(不同的國家)' –

回答

2

在組,你不能使用列別名,使用的情況下表達,而不是

SELECT 
     COUNT(country) AS no_of_countries 
    , CASE 
      WHEN density_per_sq_km > 1000 THEN 'Overpopulated' 
      WHEN density_per_sq_km > 500 THEN 'above average' 
      WHEN density_per_sq_km > 250 THEN 'average' 
      WHEN density_per_sq_km > 50 THEN 'below average' 
      ELSE 'Underpopulated' 
     END AS remarks 
FROM countries_by_population 
GROUP BY 
     CASE 
      WHEN density_per_sq_km > 1000 THEN 'Overpopulated' 
      WHEN density_per_sq_km > 500 THEN 'above average' 
      WHEN density_per_sq_km > 250 THEN 'average' 
      WHEN density_per_sq_km > 50 THEN 'below average' 
      ELSE 'Underpopulated' 
     END 
; 
+1

請問downvoter爲什麼? –

+0

你能解釋一下,我是否可以使用GROUP BY或ORDER BY中的備註方法 – Newton

+1

**您可以在ORDER BY子句中使用別名**除非使用交叉應用,否則不能使用group by子句Evaldas Buinauskas),或者您可以使用「派生表」(請參閱​​Jiri Tousek的答案)。如我所示,重新使用案例表達式時,沒有任何性能損失(根本不算)。 –

0

結束語與計算列上查詢到查詢也可以幫助您使用該列:

SELECT remarks, COUNT(country) as no_of_countries 
FROM (
    SELECT 
    CASE 
     WHEN density_per_sq_km > 1000 THEN 'Overpopulated' 
     WHEN density_per_sq_km > 500 THEN 'above average' 
     WHEN density_per_sq_km > 250 THEN 'average' 
     WHEN density_per_sq_km > 50 THEN 'below average' 
     ELSE 'Underpopulated' 
    END as remarks, 
    country 
    FROM countries_by_population 
) DT 
GROUP BY remarks; 
0

您可以使用CROSS APPLY爲您的列指定別名。

SELECT T.Remarks, COUNT(*) AS no_of_countries 
FROM countries_by_population AS CBP 
CROSS APPLY (
    SELECT CASE 
      WHEN density_per_sq_km > 1000 THEN 'Overpopulated' 
      WHEN density_per_sq_km > 500 THEN 'Above average' 
      WHEN density_per_sq_km > 250 THEN 'Average' 
      WHEN density_per_sq_km > 50 THEN 'Below average' 
      ELSE 'Underpopulated' 
     END 
    ) AS T(Remarks) 
GROUP BY T.Remarks; 

這將創建一個基於你的密度,可在GROUP BY在以後使用的列Remarks

Tip: APPLY and Reuse of Column Aliases文章解釋瞭如何使用CROSS APPLY來詳細創建可重用的列別名。

+0

這工作,但我還不熟悉CROSS APPLY和在該查詢中使用T.我是一個初學者和學習SQL – Newton

+1

@Newton你可以閱讀這個問題:http://stackoverflow.com/questions/9275132/real-life-example-when-to-use-outer-cross-apply-in-sql有也是一個鏈接,解釋如何使用它來創建別名,可以重用。這應該是一個很好的起點。 –