2016-06-28 5 views
1

Erstens denke ich, dass ich nicht tun kann, was ich ursprünglich gemacht habe, also, wenn es irgendwelche Vorschläge gibt, die sich von einem Fallausdruck entfernen, bin ich dafür offen.Wie bekomme ich mehrere "THEN" -Ergebnisse von einem Case-Ausdruck?

So einfach wie ich es machen kann, hier ist, wie ich es aussehen möchte.

SELECT * 
FROM Table_CRR 
WHERE (QTR in ('1st Quarter', '2nd Quarter')) 

Allerdings mag ich die Filter aus einem einzigen Parameter liefern, so dass, wenn ich wähle:

"1st Quarter" it gives nothing, 
"2nd Quarter" returns "1st Quarter", 
"3rd Quarter" returns both "1st Quarter" and "2nd Quarter" and 
"4th Quarter" returns "3rd Quarter", "2nd Quarter", and "1st Quarter". 

Dies ist, was ich habe.

@QuarterSelect VarChar(15) 

AS 

SET @QuarterSelect = Case 
        WHEN @QuarterSelect = '4th Quarter' THEN '3rd Quarter' 
        WHEN @QuarterSelect = '4th Quarter' THEN '2nd Quarter' 
        WHEN @QuarterSelect = '4th Quarter' THEN '1st Quarter' 
        WHEN @QuarterSelect = '3rd Quarter' THEN '2nd Quarter' 
        WHEN @QuarterSelect = '3rd Quarter' THEN '1st Quarter' 
        WHEN @QuarterSelect = '2nd Quarter' THEN '1st Quarter' 
        WHEN @QuarterSelect = '1st Quarter' THEN '' 
        ELSE '' 
        END 

SELECT * 
FROM Table_CRR 
WHERE (QTR in (@QuarterSelect)) 

Es endet offensichtlich und gibt mir nur '2. Quartal'. Ich bin sicher, dass es eine elegante Möglichkeit gibt, dies zu tun, ich habe nur Schwierigkeiten, es herauszufinden.

Jede Hilfe oder Vorschläge würden sehr geschätzt werden!

Beispiel von dem, was ich sehen will: Wenn ich den @QuarterSelect Parameter auf ‚3. Quartal‘

gesetzt
|Key |Qtr  | 
--------------------- 
|772384 |1st Quarter| 
|407038 |1st Quarter| 
|790033 |1st Quarter| 
|188914 |1st Quarter| 
|1607947|2nd Quarter| 
|1683954|2nd Quarter| 
|1607937|2nd Quarter| 
|1948397|2nd Quarter| 
... 
+1

ein CASE-Ausdruck ist skalar, gibt nur ein Ergebnis pro Zeile zurück – Lamak

+0

ist 'QTR' eine Spalte in der Tabelle? oder haben Sie eine Spalte "Datum" in der Tabelle? –

+0

Lamak - Das ist was ich finde. Ich weiß nicht, wie ich das sonst machen soll. vkp - Quartal ist eine VarChar-Spalte in der Tabelle. –

Antwort

3

Ich könnte über vereinfachen Wenn aber Ihre Strings konsistent sind, sollten Sie einen Vergleich für weniger als

SELECT * 
    FROM Table_CRR 
    WHERE 
     QTR < '1st Quarter' -- returns nothing, unless you have something else 

SELECT * 
    FROM Table_CRR 
    WHERE 
     QTR < '2st Quarter' -- returns 1st since 1 is less than 2 string compare 

SELECT * 
    FROM Table_CRR 
    WHERE 
     QTR < '3rd Quarter' -- returns 1st and 2nd since 1 & 2 are less than 3 string compare 

SELECT * 
    FROM Table_CRR 
    WHERE 
     QTR < '4th Quarter' -- returns 1st, 2nd and 3rd since 1, 2 & 3 are less than 4 string compare 
+0

HA! Mann, es ist immer das KISS-Prinzip, nicht wahr? Genau das habe ich gesucht. –

1

Ich denke, Sie sind verwirrt, wie Variablen arbeiten. Ein Fabelhaft kann nur einen Wert haben, so zu versuchen, es auf setzen zwei Werte macht keinen Sinn. Ich denken Sie wollen etwas wie:

SELECT * 
FROM Table_CRR 
WHERE (@QuarterSelect = '3rd Quarter' AND QTR in ('1st Quarter', '2nd Quarter')) OR 
     (@QuarterSelect = {next option} AND QTR in ({other options})) 

Oder erstellen Sie eine In-Memory-Mapping-Tabelle und join es:

DECLARE @OptionsMap TABLE 
(
    OPTION VARCHAR(15), 
    QTR VARCHAR(15) 
) 

INSERT INTO @OptionsMap 
VALUES ('4th Quarter' , '3rd Quarter') 
INSERT INTO @OptionsMap 
VALUES ('4th Quarter' ,'2nd Quarter') 
INSERT INTO @OptionsMap 
VALUES ('4th Quarter' ,'1st Quarter') 
INSERT INTO @OptionsMap 
VALUES ('3rd Quarter' ,'2nd Quarter') 
INSERT INTO @OptionsMap 
VALUES ('3rd Quarter' ,'1st Quarter') 
INSERT INTO @OptionsMap 
VALUES ('2nd Quarter' ,'1st Quarter') 
INSERT INTO @OptionsMap 
VALUES ('1st Quarter' , '') 

SELECT * 
FROM Table_CRR 
WHERE QTR IN (SELECT QTR FROM @OptionsMap WHERE Option = @QuarterSelect) 
+0

Richtig, und wenn ich Standardabfragen mache, folge ich, was Sie gesagt haben. Ich möchte meinen Parameter, um den Filter zu liefern, wenn ich ein bestimmtes Viertel auswähle. Ich sorge mich ich bin verwirrend. Ich werde ein Beispiel hinzufügen, was ich sehen möchte. –

+0

Sie benötigen also entweder eine Tabelle, die eine Option Ihren Filterwerten zuordnet oder verkettete Anweisungen verwendet, die ich in meiner Antwort habe. Es gibt keine Möglichkeit, mehrere Werte in einer einzelnen Skalarvariablen zu speichern oder mehrere Werte aus einer CASE-Anweisung zurückzugeben. –

+0

Das war ein Gedanke, den ich hatte.Erstellen Sie eine kleine Tabelle, die jede Parameterauswahl den Werten zuordnet, mit denen gefiltert werden soll. –

2

Dies ist ein wenig grob, aber wenn alle Ihre QTR Etiketten die gleiche Struktur, könnten Sie die erste Ziffer so verwenden, dass Ihre Abfrage wie folgt aussieht:

1

Ich sehe die Lösung ist bereits akzeptiert, aber zum Kontext der Frage ist das Folgende auch beträchtlich.

SET @QuarterSelect= 
Case 
        WHEN @QuarterSelect = '4th Quarter' THEN '''3rd Quarter'',''2nd Quarter'',''1st Quarter''' 

        WHEN @QuarterSelect = '3rd Quarter' THEN '''2nd Quarter'',''1st Quarter''' 

        WHEN @QuarterSelect = '2nd Quarter' THEN '''1st Quarter''' 

        ELSE '' 

        END 

        declare @sql nvarchar(max); 
set @sql = 'SELECT * FROM Table_CRR WHERE (QTR in (' + @QuarterSelect + ')'; 
exec sp_executesql @sql 
Verwandte Themen