2016-01-13 35 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有也是一个链接,解释如何使用它来创建别名,可以重用。这应该是一个很好的起点。 –