2012-03-26 14 views
6

W poniższym słowie sql pojawia się następujący błąd: "Nie można użyć zagregowanego lub podkwerendy w wyrażeniu używanym dla grupa według listy klauzuli GROUP BY. " Jak mogę to obejść?Nie można użyć agregatu lub podkwerendy w wyrażeniu używanym dla grupy według listy klauzuli GROUP BY

SELECT 
    T.Post, 
    COUNT(*) AS ClientCount, 
    Client = CASE COUNT(*) WHEN '1' THEN T.Client ELSE '[Clients]' END 
FROM 
    MyTable T 
GROUP BY 
    T.Post, 
    CASE COUNT(*) WHEN '1' THEN T.Client ELSE '[Clients]' END 

Odpowiedz

10

Chyba że to T.Client w twojej GROUP BY można dołączyć tylko tego pola w obrębie funkcji zbiorczej. W twoim przypadku grupowanie według tego pola zmienia logikę, więc jest to niemożliwe (i jest związane z twoją próbą zgrupowania według instrukcji CASE). Zamiast tego zawiń T.Client w funkcji agregującej.

W ten sposób grupy pozostają takie same, a gdy istnieje tylko jeden wiersz, zgodnie z testem stwierdzenia CASE, wiesz, jaki wynik uzyska funkcja zagregowana.

SELECT 
    T.Post, 
    ClientCount = COUNT(*) AS ClientCount, 
    Client  = CASE COUNT(*) WHEN 1 THEN MAX(T.Client) ELSE '[Clients]' END 
FROM 
    MyTable T 
GROUP BY 
    T.Post 
2

Nie musisz grupować według tego wyrażenia CASE.

SELECT 
    T.Post, 
    COUNT(*) AS ClientCount, 
    CASE COUNT(*) WHEN '1' THEN MIN(T.Client) ELSE '[Clients]' END Client 
FROM 
    MyTable T 
GROUP BY 
    T.Post 
+0

Jestem prawie pewien, że odniesienie do 'T.Client' nie będzie tutaj ważne, ponieważ nie jest częścią grupy. Prawdopodobnie będzie musiał zdefiniować tę kolumnę za pomocą skorelowanej pod-zapytania. –

+0

@Daniel Masz rację. Nie zwracałem uwagi na tę część. Naprawiony. – Tomalak

Powiązane problemy