Ich habe eine case-Anweisung mit> 100 Auswahlmöglichkeiten geschrieben, bei der ich dieselbe Anweisung an 4 Stellen in einer einfachen Abfrage verwende.
Dieselbe Abfrage zweimal mit einer Vereinigung zwischen ihnen, aber es wird auch gezählt, und daher enthält die Gruppe von auch die case-Anweisung.
Dies dient dazu, einige Firmennamen neu zu kennzeichnen, bei denen unterschiedliche Datensätze für dieselbe Firma unterschiedlich geschrieben sind.
Ich habe versucht, eine Variable als VarChar (MAX) zu deklarieren.
declare @CaseForAccountConsolidation varchar(max)
SET @CaseForAccountConsolidation = 'CASE
WHEN ac.accountName like ''AIR NEW Z%'' THEN ''AIR NEW ZEALAND''
WHEN ac.accountName LIKE ''AIR BP%'' THEN ''AIR BP''
WHEN ac.accountName LIKE ''ADDICTION ADVICE%'' THEN ''ADDICTION ADVICE''
WHEN ac.accountName LIKE ''AIA%'' THEN ''AIA''
...
Als ich es in meiner select-Anweisung verwendete, gab die Abfrage die case-Anweisung nur als Text zurück und bewertete sie nicht.
Ich konnte es auch nicht in der Gruppe verwenden von - Ich habe folgende Fehlermeldung erhalten:
Each GROUP BY expression must contain at least one column that is not an outer reference.
Idealerweise möchte ich den CASE nur an einem einzigen Ort haben - damit ich keine Chance habe, eine Zeile zu aktualisieren und diese nicht an anderer Stelle zu replizieren.
Gibt es eine Möglichkeit, dies zu tun?
Ich bin offen für andere Möglichkeiten (wie vielleicht eine Funktion - aber ich bin nicht sicher, wie ich sie so verwenden soll)
Hier ist ein Beispiel für das SELECT, das ich derzeit verwende
SELECT
SUM(c.charge_amount) AS GSTExcl
,dl.FirstDateOfMonth AS MonthBilled
,dl.FirstDateOfWeek AS WeekBilled
,CASE
WHEN ac.accountName like 'AIR NEW Z%' THEN 'AIR NEW ZEALAND'
WHEN ac.accountName LIKE 'AIR BP%' THEN 'AIR BP'
WHEN ac.accountName LIKE 'ADDICTION ADVICE%' THEN 'ADDICTION ADVICE'
WHEN ac.accountName LIKE 'AIA%' THEN 'AIA'
ELSE ac.accountName
END AS accountName
,dl.FinancialYear
,CONVERT(Date,c.date_charged) AS date_charged
FROM [accession] a
LEFT JOIN account_code ac ON a.account_code_id = ac.account_code_id
LEFT Join charge c ON a.accession_id = c.accession_id
LEFT JOIN dateLookup dl ON convert(date,c.date_charged) = dl.date
WHERE a.datecreated = CONVERT(DATE,now())
GROUP BY
dl.FirstDateOfMonth
,dl.FinancialYear
,dl.FirstDateOfWeek
,CONVERT(Date,c.date_charged)
,CASE
WHEN ac.accountName like 'AIR NEW Z%' THEN 'AIR NEW ZEALAND'
WHEN ac.accountName LIKE 'AIR BP%' THEN 'AIR BP'
WHEN ac.accountName LIKE 'ADDICTION ADVICE%' THEN 'ADDICTION ADVICE'
WHEN ac.accountName LIKE 'AIA%' THEN 'AIA'
ELSE ac.accountName
END
UNION
SELECT
SUM(c.charge_amount) AS GSTExcl
,dl.FirstDateOfMonth AS MonthBilled
,dl.FirstDateOfWeek AS WeekBilled
,CASE
WHEN ac.accountName like 'AIR NEW Z%' THEN 'AIR NEW ZEALAND'
WHEN ac.accountName LIKE 'AIR BP%' THEN 'AIR BP'
WHEN ac.accountName LIKE 'ADDICTION ADVICE%' THEN 'ADDICTION ADVICE'
WHEN ac.accountName LIKE 'AIA%' THEN 'AIA'
ELSE ac.accountName
END AS accountName
,dl.FinancialYear
,CONVERT(Date,c.date_charged) AS date_charged
FROM [accession] a
LEFT JOIN account_code ac ON a.account_code_id = ac.account_code_id
LEFT Join charge c ON a.accession_id = c.accession_id
LEFT JOIN dateLookup dl ON convert(date,c.date_charged) = dl.date
WHERE a.datecreated = DATEADD(YEAR,-1,CONVERT(DATE,now()))
GROUP BY
dl.FirstDateOfMonth
,dl.FinancialYear
,dl.FirstDateOfWeek
,CONVERT(Date,c.date_charged)
,CASE
WHEN ac.accountName like 'AIR NEW Z%' THEN 'AIR NEW ZEALAND'
WHEN ac.accountName LIKE 'AIR BP%' THEN 'AIR BP'
WHEN ac.accountName LIKE 'ADDICTION ADVICE%' THEN 'ADDICTION ADVICE'
WHEN ac.accountName LIKE 'AIA%' THEN 'AIA'
ELSE ac.accountName
END
Der Zweck dieser UNION besteht darin, alle Daten für einen bestimmten Zeitraum zurückzugeben und AUCH 12 Monate zuvor Daten für denselben Zeitraum zurückzugeben
EDIT: Ein fehlendes "CATCH-ALL" wurde
hinzugefügt. EDIT2: Eine zweite
Hälfte der UNION-Anweisung wurde hinzugefügt. EDIT3: Die GROUP BY wurde korrigiert, um einige andere notwendige Elemente aufzunehmen
WHERE a.datecreated = CONVERT(DATE,now()) OR a.datecreated = DATEADD(YEAR,-1,CONVERT(DATE,now()))
?