2012-09-27 10 views
9

chcę dodać niektóre obliczenia wewnątrz mojego oświadczenia przypadku dynamicznego tworzenia zawartości nowej kolumny, ale pojawia się błąd:Jak zrobić SUM() wewnątrz instrukcji case w serwerze SQL

Column 'Test1.qrank' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

ten to kod, nad którym pracuję: Próbowałem zgrupować, ale to nie zadziałało.

Jakieś wskazówki?

+0

Jakie jest pozostałe zapytanie. Jeśli brakuje ci GROUP BY ... –

Odpowiedz

0

Jeśli używasz programu SQL Server 2005 lub nowszego, możesz użyć funkcji okienkowania SUM() OVER().

case 
when test1.TotalType = 'Average' then Test2.avgscore 
when test1.TotalType = 'PercentOfTot' then (cnt/SUM(test1.qrank) over()) 
else cnt 
end as displayscore 

Ale lepiej będzie, jeśli pokażesz swoje pełne zapytanie, aby uzyskać kontekst rzeczywistych potrzeb.

+0

, używając 'over()' zwraca wiele 'sum kolumn ', a także błędny wynik. –

1

Można użyć wspólnego wyrażenia tabelowego, aby najpierw utworzyć SUM, połączyć je z tabelą, a następnie użyć parametru WHEN, aby uzyskać wartość z CTE lub oryginalnej tabeli, jeśli to konieczne.

WITH PercentageOfTotal (Id, Percentage) 
AS 
(
    SELECT Id, (cnt/SUM(AreaId)) FROM dbo.MyTable GROUP BY Id 
) 
SELECT 
    CASE 
     WHEN o.TotalType = 'Average' THEN r.avgscore 
     WHEN o.TotalType = 'PercentOfTot' THEN pt.Percentage 
     ELSE o.cnt 
    END AS [displayscore] 
FROM PercentageOfTotal pt 
    JOIN dbo.MyTable t ON pt.Id = t.Id 
21

Opublikowany błąd może się zdarzyć, gdy używasz klauzuli w instrukcji GROUP BY, nie umieszczając jej w polu wyboru.

Przykład

Ten działa!

 SELECT t.device, 
      SUM(case when transits.direction = 1 then 1 else 0 end) , 
      SUM(case when transits.direction = 0 then 1 else 0 end) from t1 t 
      where t.device in ('A','B') group by t.device 

to nie jeden (pominięty t.device z select)

 SELECT 
      SUM(case when transits.direction = 1 then 1 else 0 end) , 
      SUM(case when transits.direction = 0 then 1 else 0 end) from t1 t 
      where t.device in ('A','B') group by t.device 

To będzie produkować swój błąd twierdząc, że mam grupowanie za coś, co nie jest wliczone w wybranej

Proszę podać wszystkie zapytania, aby uzyskać więcej wsparcia.

Powiązane problemy