2015-08-10 13 views
7

Jestem nowy w SQL.SQL: GROUP BY multiple columns with CASE statement

Chciałbym użyć GROUP BY z instrukcją CASE, aby zgrupować wyniki w określony sposób, jeśli @myboolean jest prawdziwe.

Widziałem wiele przykładów, jak używać GROUP BY i CASE BY z jednego pola, czyli jak korzystać z wielu pól GROUP BY bez CASE oświadczeniu.

Nie wiem jak połączyć te dwa elementy. Kiedy ująć pola GROUP BY ramach rachunku CASE, pojawia się błąd składni:

Incorrect syntax near ','

Tak, to działa:

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

To daje błąd składni:

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

I już przejrzałem następujące pytania:

używam Microsoft SQL Server Management Studio.

Proszę zauważyć, że dziedziczę bardzo skomplikowane/długie instrukcje SQL, których chcę uniknąć za dużo. Nie chcę podzielić zapytania na dwie oddzielne instrukcje: SELECT.

+0

sprawę można zwrócić tylko jedna kolumna/wartość, a nie kilka. – jarlh

+0

@jarlh dzięki. Co powinienem robić zamiast tego? –

+0

CASE nie działa tak jak oczekujesz – mxix

Odpowiedz

8

Można użyć ...

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

Jeśli @myboolean nie jest 1 że ocenia się NULL która nie wpływa na wynik.

Jeśli jest przechowywany w procedurze, można również użyć numeru IF.

+0

Jeśli @moboolean będzie miało wartość 1, to czy powinno to być prawdziwe? –

+0

@RahulDubey: jeśli '@ myboolean' ma wartość' 1', to 'CASE' zwraca wartość 'prawda', a klauzula' THEN' zwraca wyrażenie zdefiniowane za, więc 'field2',' field3' lub 'field4'. –

+0

naprawdę miło odpowiedział przez ciebie. Dziękuję. –

1

można spróbować w ten sposób:

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