2016-09-28 8 views
2

Wie es ist, dass diese gilt:Bestimmen Gruppierung von Parametern -

ALTER PROCEDURE [StoredProcedure] 

@abcID int = null -- optional param 

SELECT columnJ, columnK, Count(eID) AS Num, Sum(OutXYZ) as TotalProdXYZ, Sum(RawXYZ) as TotalRawXYZ 
FROM [v_ViewTable] 
WHERE (@abcID IS NULL OR (abcID = @abcID)) 

GROUP BY columnJ, columnK 

Aber dann ist dies wirft einen „columnJ in der Auswahlliste ungültig ist, weil es in einer Aggregatfunktion nicht enthalten ist oder den GROUP BY-Klausel. "

ALTER PROCEDURE [StoredProcedure] 

@abcID int = null -- optional param 

-- if 0: Group by columnJ, columnK 
-- else: Group by columnK, columnJ 
, @Grouping int = null 

SELECT columnJ, columnK, Count(eID) AS Num, Sum(OutXYZ) as TotalProdXYZ, Sum(RawXYZ) as TotalRawXYZ 
FROM [v_ViewTable] 
WHERE (@abcID IS NULL OR (abcID = @abcID)) 

GROUP BY 
CASE WHEN @Grouping = 0 THEN columnJ ELSE columnK END 
,CASE WHEN @Grouping = 0 THEN columnK ELSE columnJ END 

Was ist los mit meiner CASE-Anweisung? Grundsätzlich, wenn @Grouping = 0, möchte ich die Gruppe von J, K wenn noch etwas anderes, es sollte K sein, J

Vielen Dank im Voraus für jede Hilfe!

+0

... habe ich vergessen "AS BEGIN" in meinem Beispiel zu setzen, aber es ist in meinem eigentlichen Code in SQL Server ... – blacksaibot

+0

erhalten Sie die Fehler, wenn Sie NULL übergeben oder wenn Sie etwas übergeben? – scsimon

Antwort

1

Wie die Nachricht sagt columnJ und columnK sind nicht in einer Aggregat-Funktion oder die GROUP BY-Klausel im zweiten Fall enthalten. Sie sollten das Feld oder den exakten Ausdruck in der Auswahlliste AS IS im Abschnitt GROUP BY verwenden.

So ist die folgende Aussage ok sein wird:

SELECT CASE WHEN @Grouping = 0 THEN columnJ ELSE columnK END, 
     CASE WHEN @Grouping = 0 THEN columnK ELSE columnJ END, 
     Count(eID) AS Num, Sum(OutXYZ) as TotalProdXYZ, Sum(RawXYZ) as TotalRawXYZ 
FROM [v_ViewTable] 
WHERE (@abcID IS NULL OR (abcID = @abcID)) 

GROUP BY 
CASE WHEN @Grouping = 0 THEN columnJ ELSE columnK END 
,CASE WHEN @Grouping = 0 THEN columnK ELSE columnJ END