Eseguire un count su una case ...when in sql

lunedì 04 maggio 2009 - 09.42

trinity Profilo | Guru

Salve ragazzi,
io ho scritto questo:

case when COUNT(cam.nrcamera)<25 then 1
when COUNT(cam.nrcamera) >=100 then 3
ELSE 2
END As CodiceOrdinamento,

ora dovrei eseguire in pratica un count su CodiceOrdinamento ma, sql mi dice giustamente: Il nome di colonna 'CodiceOrdinamento' non è valido.

Come posso fare?
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Salve ragazzi,
Ciao

>io ho scritto questo:
>case when COUNT(cam.nrcamera)<25 then 1
>when COUNT(cam.nrcamera) >=100 then 3
>ELSE 2
>END As CodiceOrdinamento,
>
>ora dovrei eseguire in pratica un count su CodiceOrdinamento
>ma, sql mi dice giustamente: Il nome di colonna 'CodiceOrdinamento'
>non è valido.
>
>Come posso fare?
se devi proprio contare quel campo, devi passare da una subquery, ovvero una cosa tipo:

SELECT COUNT(T.CodiceOrdinamento) FROM ( SELECT ..., CASE WHEN COUNT(cam.nrcamera)<25 THEN 1 WHEN COUNT(cam.nrcamera) >=100 THEN 3 ELSE 2 END As CodiceOrdinamento, ... FROM TueTabelle ... ) AS T
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

trinity Profilo | Guru

Guarda io ho scritto così, ti posto tutto il codice:

SELECT tblTemp.codcomune, tblTemp.comune, tblTemp.CodiceOrdinamento, count(tblTemp.CodiceOrdinamento)as totstrutture, tblTemp.TotCamere, tblTemp.TotLetti, tblTemp.TotBagni FROM ( select alb.codcomune, c.comune, case when COUNT(cam.nrcamera)<25 then 1 when COUNT(cam.nrcamera) >=100 then 3 ELSE 2 END as CodiceOrdinamento, COUNT(cam.nrcamera) As TotCamere, isnull(sum(cam.nrletti)+sum(cam.nrlettiextra),'0') As TotLetti, isnull(Sum(cam.nrbagni),'0') As TotBagni From albergo as alb join dbo.comuni as c ON alb.codcomune=c.codcomune join anagrafica_camere as cam ON alb.codalb=cam.codalbergo group by alb.codcomune,c.comune ) AS tblTemp group by tblTemp.codcomune, tblTemp.comune, tblTemp.CodiceOrdinamento, tblTemp.totcamere, tblTemp.totletti, tblTemp.totbagni

calcola però che come risultato mi esce questo:

60001 Acquafondata 1 1 3 8 3
60038 Frosinone 2 1 82 130 82

invece nel comune di frosinone come totstrutture dovrebbe esserci 3 e non 1 in quanto nel db ci sono 3 record che hanno codiceordinamento=2

pertanto il risultato doveva essere il seguente:

60001 Acquafondata 1 1 3 8 3
60038 Frosinone 2 3 82 130 82

ho provato anche a fare sum(tblTemp.CodiceOrdinamento)as totstrutture, ma nulla...dove sbaglio?


ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Guarda io ho scritto così, ti posto tutto il codice:
>ho provato anche a fare sum(tblTemp.CodiceOrdinamento)as totstrutture,
>ma nulla...dove sbaglio?
Ciao, con il post precedente ti ho risolto il problema di sintassi. Per capire come mai il resultset è sbagliato, ho bisogno dei dati di esempio e delle tabelle coinvolte nella query..
riesci a postarli?
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

trinity Profilo | Guru

Allora ecco tutto ciò che ti potrebbe servire:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

i dati sono un pò particolari perchè dovremmo avere in teoria tanti record ora ne posto alcuni:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra



ho messo i record al di sotto delle 25 camere...

ossia io devo prendere tutti gli alberghi per comune, vedere se sono inferiori a 25 camere e sommare il tutto ottenendo anche il numero di strutture al di sotto delle 25 camere.
Lo stesso per strutture tra 25 e 99 e poi superiore alle 100.
Nella select creo anche un codiceordinamento perchè poi mi serve in vb per il fine di una stampa....

questa è la tabella albergo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

questa è la tabella comuni:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra



il risultato che deve uscire è il seguente:

60001=Roma
60002=Pisa
60003=Latina

quindi

codicecomune comune codiceordinamento totstrutture totcamere totletti totbagni
60001 Roma 1 1 4 12 4
60002 Pisa 1 2 4 12 4
60003 latina 1 1 1 3 1
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

alx_81 Profilo | Guru

>Allora ecco tutto ciò che ti potrebbe servire:
Mancano ancora i dati dei comuni e degli alberghi.. mi hai passato solo le insert (errate, hanno un campo in più, è corretto rimuovere il primo valore?) della camere..
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5