2015-08-10 14 views
7

Sono nuovo di SQL.SQL: GROUP BY colonne multiple con istruzione CASE

Mi piacerebbe utilizzare GROUP BY con una dichiarazione CASE, per raggruppare i risultati in un modo particolare se @myboolean è true.

Ho visto molti esempi di come utilizzare GROUP BY e CASE BY con un singolo campo, o come usare GROUP BY con più campi, senza una dichiarazione CASE.

Non so come combinare i due. Quando Allego i campi GROUP BY all'interno dell'istruzione CASE, ottengo un errore di sintassi:

Incorrect syntax near ','

Quindi, questo funziona:

GROUP BY 
/* This works with no enclosing CASE statement */ 
field1, 
field2, 
field3, 
field4 

Questo produce un errore di sintassi:

GROUP BY 
CASE WHEN (@myboolean=1) 
    THEN 
    field1, <-- ERROR HERE: Incorrect syntax near ',' 
    field2, 
    field3, 
    field4 
    ELSE 
    field1 
    END 

I ho già visto queste domande:

sto usando Microsoft SQL Server Management Studio.

Si noti che sto ereditando un'istruzione SQL molto complessa/lunga, che voglio evitare di alterare troppo. Non voglio dividere la query in due istruzioni separate SELECT.

+0

un caso può restituire solo una colonna/valore, non diversi. – jarlh

+0

@jarlh grazie. Cosa dovrei fare invece? –

+0

il CASE non funziona come ci si aspetta – mxix

risposta

8

Si potrebbe utilizzare ...

GROUP BY field1, 
    CASE WHEN @myboolean=1 THEN field2 END, 
    CASE WHEN @myboolean=1 THEN field3 END, 
    CASE WHEN @myboolean=1 THEN field4 END 

Se @myboolean non è 1 che restituisce NULL che non pregiudica il risultato.

Se è in una stored procedure, è possibile utilizzare anche IF.

+0

Se @myboolean sarà 1, allora dovrebbe essere vero questa condizione? –

+0

@RahulDubey: se '@ myboolean' è' 1' il 'CASE' restituisce' true' e la clausola 'THEN' restituisce l'espressione definita dietro, quindi' field2', 'field3' o' field4'. –

+0

davvero bella risposta da voi. Grazie. –

1

Si può provare in questo modo:

IF (@myboolean=1) 
BEGIN 
SELECT 
field1, 
field2, 
field3, 
field4 
FROM myTable 
GROUP BY 
field1, 
field2, 
field3, 
field4 

END 
ELSE 
BEGIN 
SELECT 
field1 
FROM myTable 
GROUP BY 
field1 
END