ฉันเขียนคำสั่ง case ด้วยตัวเลือกมากกว่า 100 ตัวเลือกซึ่งฉันใช้คำสั่งเดียวกันใน 4 แห่งในการค้นหาแบบง่าย
แบบสอบถามเดียวกันสองครั้งที่มีการรวมกันระหว่างพวกเขา แต่ยังมีการนับและดังนั้นกลุ่มโดยยังมีคำสั่งกรณี
นี่คือการติดฉลากชื่อ บริษัท บางรายการที่มีการสะกดคำที่แตกต่างกันสำหรับ บริษัท เดียวกันต่างกัน
ฉันพยายามประกาศตัวแปรเป็น 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''
...
เมื่อฉันไปใช้ในคำสั่ง select - แบบสอบถามเพิ่งส่งคืนคำสั่ง case เป็นข้อความและไม่ได้ประเมิน
ฉันยังไม่สามารถใช้ในกลุ่มได้ - ฉันได้รับข้อความแสดงข้อผิดพลาดนี้:
Each GROUP BY expression must contain at least one column that is not an outer reference.
โดยหลักการแล้วฉันต้องการที่จะมีเคสในที่แห่งเดียว - เพื่อให้ไม่มีโอกาสที่ฉันจะอัปเดตหนึ่งบรรทัดและไม่ลอกเลียนแบบที่อื่น
มีวิธีการทำเช่นนี้?
ฉันเปิดให้ใช้วิธีอื่น (เช่นอาจเป็นฟังก์ชั่น - แต่ฉันไม่แน่ใจว่าจะใช้มันอย่างไร)
นี่คือตัวอย่างของ SELECT ที่ฉันกำลังใช้อยู่
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
จุดประสงค์สำหรับ UNION นี้คือการส่งคืนข้อมูลทั้งหมดสำหรับช่วงเวลาชั่วคราวและนอกจากนี้ยังจะส่งคืนข้อมูลช่วงเวลาเดียวกันสำหรับ 12 เดือนก่อนหน้านี้
แก้ไข: เพิ่ม "CATCH-ALL" ที่ขาดหายไปแก้ไข 2: เพิ่ม
second วินาทีของคำสั่ง UNION
EDIT3: แก้ไข GROUP BY เพื่อรวมองค์ประกอบที่จำเป็นอื่น ๆ
WHERE a.datecreated = CONVERT(DATE,now()) OR a.datecreated = DATEADD(YEAR,-1,CONVERT(DATE,now()))
?