2012-01-06 20 views
5

SQL 2005, Ho una tabella con una colonna 'ages_c', ho bisogno di raggruppare i record per fasce d'età. Questa è la domanda che ho trovato su questo sito e mi sta ottenendo il 90% lì, ma il 'gruppo da' è erroring, * non valido nome della colonna 'AGE_RANGE' *SQL per fascia di età

select 
    case 
    when age_c <18 then 'Under 18' 
    when age_c between 18 and 24 then '18-24' 
    when age_c between 25 and 34then '25-34' 
END as age_range, 
Count(*) as count 
from contacts 
group by age_range 
order by age_range 

Quando ho gruppo e l'ordine da 'age_c 'il mio risultato è:

Under 18 1 
    18-24 1 
    18-24 1 
    25-34 1 

Quello che voglio è:

Under 18 1 
    18-24 2  
    25-34 1 

Grazie.

risposta

9

Prova in questo modo invece:

SELECT SUM(CASE WHEN age_c < 18 THEN 1 ELSE 0 END) AS [Under 18], 
     SUM(CASE WHEN age_c BETWEEN 18 AND 24 THEN 1 ELSE 0 END) AS [18-24], 
     SUM(CASE WHEN age_c BETWEEN 25 AND 34 THEN 1 ELSE 0 END) AS [25-34] 
FROM contacts 
+1

Grazie Joe ... apprezzo la semplicità. – Stan

7

Gruppo di age_c - age_range non è una colonna fisica. Più in particolare, procedere come segue:

group by case 
    when age_c <18 then 'Under 18' 
    when age_c between 18 and 24 then '18-24' 
    when age_c between 25 and 34then '25-34' 
END 

Dal age_range è una colonna alias, il group by non è a conoscenza di esso a tutti. Il raggruppamento avviene prima che il set di colonne sia calcolato. L'unica clausola in cui è possibile utilizzare gli alias è order by, poiché questa è l'unica clausola che viene eseguita dopo il il set di colonne viene calcolato.

+0

che non funziona per lui, lui vuole gamme . –

+0

@ Sheridanbulger questo è esattamente ciò che è stato chiesto e funziona bene. Vedere un esempio funzionante in [Raggruppamento per esempio] (http://data.stackexchange.com/stackoverflow/s/2346/grouping-by-case-example) –

+0

Oh mi dispiace. A prima vista ho visto il raggruppamento di age_c. L'hai modificato? In entrambi i casi, sì, quel codice (o una qualsiasi delle altre risposte) funzionerebbe alla grande. –

0

È il tuo codice attuale che stai utilizzando? Non sembra perché ti manca uno spazio tra 34 e poi. Quel codice sarebbe un errore in SQL. Mente condividendo la query effettiva non modificata?

Ad ogni modo, è possibile utilizzare una tabella temporanea o una query nidificata.

SELECT 
CASE 
    WHEN age_c <18 THEN 'Under 18' 
    WHEN age_c BETWEEN 18 AND 24 THEN '18-24' 
    WHEN age_c BETWEEN 25 AND 34 THEN '25-34' 
END AS age_range, 
INTO #TempAges 
FROM contacts 
ORDER BY age_c 

SELECT COUNT(*) FROM #TempAges GROUP BY age_range 

Non dimenticare di eliminare la tabella temporanea quando hai finito con esso

0

Non puoi gruppo da una colonna si crea nella query. Dovrete fare in questo modo:

SELECT count(*), * FROM 
(
select 
    case 
    when age_c <18 then 'Under 18' 
    when age_c between 18 and 24 then '18-24' 
    when age_c between 25 and 34then '25-34' 
END as age_range 
from contacts 
) t 
group by age_range 
order by age_range 

o GROUP BY

case 
     when age_c <18 then 'Under 18' 
     when age_c between 18 and 24 then '18-24' 
     when age_c between 25 and 34then '25-34' 
END 
+0

Preferirei una tabella temporanea ad un nidificato query solo perché rende una query dall'aspetto più pulito, ma sono davvero due facce della stessa medaglia. –

+0

Grazie Mithrandir. Questo è molto vicino, ho dovuto riorganizzarlo un po 'per farlo funzionare ... ma funziona lo fa. – Stan

Problemi correlati