Tôi đã viết một câu lệnh tình huống với> 100 lựa chọn trong đó tôi đang sử dụng cùng một câu lệnh ở 4 vị trí trong một truy vấn đơn giản.
Truy vấn tương tự hai lần với một liên kết giữa chúng nhưng cũng đang thực hiện đếm và do đó nhóm cũng chứa câu lệnh tình huống.
Điều này là để dán lại một số tên công ty trong đó các hồ sơ khác nhau cho cùng một công ty được đánh vần khác nhau.
Tôi đã cố gắng khai báo một biến là 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''
...
Khi tôi đi sử dụng nó trong câu lệnh chọn của mình - truy vấn chỉ trả về câu lệnh tình huống dưới dạng văn bản và không đánh giá nó.
Tôi cũng không thể sử dụng nó trong nhóm bởi - Tôi nhận được thông báo lỗi này:
Each GROUP BY expression must contain at least one column that is not an outer reference.
Lý tưởng nhất là tôi muốn có CASE ở một nơi duy nhất - để tôi không có cơ hội cập nhật một dòng và không sao chép nó ở nơi khác.
Có một số cách để làm điều này?
Tôi mở cho các cách khác (Có thể là một hàm - nhưng tôi không chắc cách sử dụng chúng như thế này)
Đây là một mẫu của CHỌN tôi hiện đang sử dụng
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
Mục đích của UNION này là trả về tất cả dữ liệu cho đồng hồ bấm giờ và CSONG để trả lại dữ liệu cho cùng một đồng hồ trong 12 tháng trước
EDIT: Đã thêm
EDIT2 "CATCH-ALL" bị thiếu : Đã thêm một giây ½ của câu lệnh UNION
EDIT3: Đã sửa NHÓM THEO để bao gồm một số yếu tố cần thiết khác
WHERE a.datecreated = CONVERT(DATE,now()) OR a.datecreated = DATEADD(YEAR,-1,CONVERT(DATE,now()))
?