/ / ग्रुप बाय में अलियास अनुपलब्ध - sql-server, tsql, group-by, उपनाम

उपनाम-sql-सर्वर, tsql, समूह-द्वारा, उपनाम समूह में अनुपलब्ध

मुझे ग्रुप बनाना है BaseIncidencia कॉलम (मानों का योग), लेकिन यह अनुपलब्ध है। में कहा गया एसक्यूएल सर्वर एएस स्टेटमेंट स्टेटमेंट कॉलम जिसमें WHERE स्टेटमेंट है यह सरल होगा, लेकिन मुझे केवल उल्लेख करने के लिए एक कॉलम नाम नहीं है।

BEGIN
SELECT @Artigo AS Artigo, T1.Contrib AS ContribID, YEAR(T1.Data) AS Ano, T3.DescricaoMes, CAST(ROUND(SUM(T1.Debito/0.23),2) AS decimal(16,2)) BaseIncidencia,
CAST(ROUND(SUM(T1.Debito),2) AS decimal(16,2)) AS IVA, (CASE WHEN T5.Valid = "True" THEN "VALIDO" WHEN T5.Name = "---" THEN "INEXISTENTE" ELSE "INVALIDO" END) AS "ValidadeNIF"
FROM
#CONTAS_INI AS T1
LEFT JOIN
db.dbo.VatCheck T5
ON T1.ContribuinteID = T5.VatNumber
LEFT JOIN
#Meses AS T3
ON MONTH(T1.Data) = T3.Mes
GROUP BY T1.CntID, T1.ContribuinteID, YEAR(T1.Data), (CASE WHEN T5.Valid = "True" THEN "VALIDO"
WHEN T5.Name = "---" THEN "INEXISTENTE" ELSE "INVALIDO" END), T3.DescricaoMes
ORDER BY (CASE WHEN T5.Valid = "True" THEN "VALIDO" WHEN T5.Name = "---" THEN "INEXISTENTE" ELSE "INVALIDO" END), T1.ContribuinteID
END

मैंने निम्नलिखित पंक्ति को बदलने का प्रयास किया:

GROUP BY T1.CntID, T1.ContribuinteID, YEAR(T1.Data), (CASE WHEN T5.Valid = "True" THEN "VALIDO"

साथ में:

GROUP BY T1.CntID, T1.ContribuinteID, YEAR(T1.Data), CAST(ROUND(SUM(T1.Debito/0.23),2) AS decimal(16,2)), (CASE WHEN T5.Valid = "True" THEN "VALIDO"

केवल पाने के लिए Cannot use an aggregate or a subquery in an expression used for the group by list of a GROUP BY clause. त्रुटि।

तो मेरा सवाल है, मैं क्यों "टी शामिल कर सकते हैं BaseIncidencia उर्फ बाय बाय? और क्या समाधान है?

उत्तर:

जवाब के लिए 2 № 1

एसक्यूएल को लागू किया जाता है जैसे कि निम्नलिखित क्रम में एक क्वेरी निष्पादित की गई थी:

  1. खंड से
  2. कहां कारण
  3. खंड द्वारा ग्रुप
  4. हैविंग खंड
  5. खंड चुनें
  6. खंड द्वारा आदेश

अधिकांश रिलेशनल डेटाबेस सिस्टम के लिए, यह आदेश बताता है कि कौन से नाम (कॉलम या उपनाम) मान्य हैं क्योंकि उन्हें पिछले चरण में पेश किया गया होगा।

तो SQL सर्वर में, आप उस समूह BY खंड में एक शब्द का उपयोग करते हैं जिसे आप SELECT खंड में परिभाषित करते हैं क्योंकि समूह BY को SELECT खंड से पहले निष्पादित किया जाता है।


जवाब के लिए 0 № 2

आप "समूह को अभिव्यक्ति द्वारा ले सकते हैं क्योंकि यह एक समुच्चय है। मूल्यों द्वारा समूह का उपयोग उस स्तर को निर्धारित करने के लिए किया जाता है जिस पर एक समुच्चय संचालित होता है।

एक सरल उदाहरण के रूप में:

Select Count(*),
Object_id
From sys.columns
Group by Object_id

यह समझना काफी आसान है। प्रत्येक ऑब्जेक्ट के लिए कॉलम रिकॉर्ड की संख्या की गणना करें।

आप जो करने की कोशिश कर रहे हैं वह इसके बराबर होगा

SELECT      COUNT( * ),
object_id
FROM      sys.columns
GROUP BY  COUNT( * ),
object_id

प्रत्येक object_id की गिनती के लिए, मुझे प्रत्येक object_id की गिनती दें। यह समझ में नहीं आता है।

त्रुटि संदेश आपको मिल रहा है:

Cannot use an aggregate or a subquery in an expression used for the group by list of a GROUP BY clause

आपको बता रहा है कि आप समग्र अभिव्यक्ति द्वारा "t समूह" कर सकते हैं।


जवाब के लिए 0 № 3

12 दिसंबर को उत्तर देना। उत्तर के रूप में टिप्पणी।

आप शायद अपने मूल को लपेटना चाहते हैं SELECT ... FROM ... साथ में SELECT * FROM ( /*your original half*/ ) AS T, छोड़ना GROUP ... ORDER ... भागों के बाद आने के लिए यह आपको अपने भीतर उत्पन्न किसी भी उपनाम का संदर्भ देने की अनुमति देगा SELECT आपके में GROUP ... ORDER ... भागों।

हालाँकि, के बाद से GROUP एक अलग स्तर पर ले जाता है, आपको "जैसे एकत्रीकरण को स्थानांतरित करना होगा।" SUM नए स्तर पर भी। इसके अलावा, आप "अपनी तालिकाओं के लिए सीधी पहुँच खो देंगे, इसलिए अधिकतर संभावना है कि आपको उपयोग किए जाने वाले टेबल उपनामों को बदलना होगा।" GROUP ... ORDER ... खंडों को T, प्लस यह सुनिश्चित करता है कि सभी कॉलम GROUP ... ORDER ... भागों का उपयोग कर रहे हैं भीतर में उत्पादित कर रहे हैं SELECT। यह सब हालांकि संभालना आसान होना चाहिए।