Saya menulis pernyataan kasus dengan> 100 pilihan di mana saya menggunakan pernyataan yang sama di 4 tempat dalam permintaan sederhana.
Kueri yang sama dua kali dengan penyatuan di antara mereka tetapi juga melakukan penghitungan dan karenanya grup juga berisi pernyataan kasus.
Ini untuk memberi label ulang beberapa nama perusahaan di mana catatan yang berbeda untuk perusahaan yang sama dieja secara berbeda.
Saya mencoba mendeklarasikan variabel sebagai VarChar (MAX)
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''
...
Ketika saya pergi untuk menggunakannya dalam pernyataan pilih saya - permintaan hanya mengembalikan pernyataan kasus sebagai teks dan tidak mengevaluasinya.
Saya juga tidak dapat menggunakannya dalam grup oleh - Saya mendapat pesan kesalahan ini:
Each GROUP BY expression must contain at least one column that is not an outer reference.
Idealnya saya ingin memiliki KASUS hanya di satu tempat - sehingga tidak ada kesempatan saya memperbarui satu baris dan tidak mereplikasi itu di tempat lain.
Apakah ada cara untuk melakukan ini?
Saya terbuka untuk cara lain (Seperti mungkin suatu fungsi - tapi saya tidak yakin bagaimana menggunakannya seperti ini)
Berikut adalah contoh SELECT yang saya gunakan saat ini
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
Tujuan untuk UNION ini adalah untuk mengembalikan semua data untuk periode waktu, dan JUGA untuk mengembalikan data untuk periode yang sama selama 12 bulan sebelumnya
EDIT: Menambahkan hilang "CATCH-ALL"
EDIT2: Menambahkan ½ kedua dari pernyataan UNION
EDIT3: Koreksi GROUP BY untuk memasukkan beberapa elemen yang diperlukan lainnya
WHERE a.datecreated = CONVERT(DATE,now()) OR a.datecreated = DATEADD(YEAR,-1,CONVERT(DATE,now()))
?