मैंने> 100 विकल्पों के साथ एक केस स्टेटमेंट लिखा जहां मैं एक साधारण क्वेरी में 4 स्थानों पर एक ही स्टेटमेंट का उपयोग कर रहा हूं।
उनके बीच एक संघ के साथ एक ही क्वेरी दो बार लेकिन एक गिनती भी कर रही है और इसलिए समूह द्वारा भी केस स्टेटमेंट शामिल है।
यह कुछ कंपनी के नामों को रीलैब करने के लिए है जहां एक ही कंपनी के लिए अलग-अलग रिकॉर्ड अलग-अलग तरीके से लिखे गए हैं।
मैंने एक चर को चर (मैक्स) घोषित करने की कोशिश की
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''
...
जब मैं इसे अपने चुनिंदा स्टेटमेंट में इस्तेमाल करने गया - तो क्वेरी ने केस स्टेटमेंट को टेक्स्ट के रूप में लौटाया और उसका मूल्यांकन नहीं किया।
मैं भी समूह में इसका उपयोग करने में असमर्थ था - मुझे यह त्रुटि संदेश मिला:
Each GROUP BY expression must contain at least one column that is not an outer reference.
आदर्श रूप में मैं केवल एक ही स्थान पर CASE करना चाहूंगा - ताकि मुझे एक पंक्ति को अपडेट करने और उस अन्य जगह की नकल न करने का कोई मौका न हो।
क्या ऐसा करने का कोई तरीका है?
मैं अन्य तरीकों से खुला हूं (जैसे शायद कोई फ़ंक्शन - लेकिन मुझे यकीन नहीं है कि उन्हें इस तरह कैसे उपयोग करना है)
यहाँ अभी मैं जो 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 का उद्देश्य एक टाइमपरोड के लिए सभी डेटा को वापस करना है, और ALSO को उसी टाइमस्पिरोड के लिए डेटा को 12 महीने पहले वापस करना है।
संपादित करें: एक लापता "CATCH-ALL"
EDIT2 जोड़ा गया: UNION कथन का एक दूसरा second जोड़ा गया
EDIT3: कुछ अन्य आवश्यक तत्वों को शामिल करने के लिए समूह द्वारा सही किया गया
WHERE a.datecreated = CONVERT(DATE,now()) OR a.datecreated = DATEADD(YEAR,-1,CONVERT(DATE,now()))
?