2016-01-13 8 views
1

Я использую этот SQL Server database. Я определяю следующие замечания для странSQL Server: как использовать счет

Теперь я хочу подсчитать, сколько стран присутствует в каждом примечании. Как я могу это сделать? Я использую следующий запрос, но он не

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). При повторном использовании выражения case, как я показал, нет штрафа за производительность (вообще). –

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; 

Это создаст столбец Remarks на основе вашей плотности, которая затем может быть использована в GROUP BY.

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 есть также ссылка, которая объясняет, как вы можете использовать ее для создания псевдонимов, которые могут быть повторно использованы. Это должно быть хорошей отправной точкой. –

Смежные вопросы