मैं एक ही पंक्ति में MTD और YTD मान रखने के लिए एक SQL क्वेरी कैसे बनाऊं?


मेरे पास एक क्रिस्टल रिपोर्ट है जिसे मैं वर्तमान में एसएसआरएस में परिवर्तित कर रहा हूं। इस रिपोर्ट में MTD (माह से दिनांक मान) के लिए 3 कॉलम और YTD (वर्ष से दिनांक मान) के लिए 3 कॉलम हैं। मैं उन 3 कॉलमों को अलग-अलग करने में सक्षम हूं लेकिन डेटा सटीकता के लिए मुझे इसे एक पंक्ति में आउटपुट के लिए एक SQL स्टेटमेंट में संयोजित करने की आवश्यकता है। मैं एसक्यूएल में कुछ कोलेसेस फ़ंक्शंस का उपयोग करके इसे लगभग इसके करीब लाने में सक्षम था। मुद्दा यह है कि यह मुझे कमांड द्वारा समूह का उपयोग करने नहीं देगा और मुझे एक त्रुटि देगा। मुझे अपनी SQL क्वेरी में नीचे दी गई क्रिस्टल रिपोर्ट में दिखाए गए तरीके से क्या संपादित करना चाहिए?
गलती :

Msg 512, Level 16, State 1, Line 106
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

वर्तमान क्रिस्टल रिपोर्ट जिसे मैं एसएसआरएस में परिवर्तित कर रहा हूं

संपादित करें: मैंने अभी एक नमूना dbfiddle बनाया है: डीबी फिडल – एसक्यूएल डेटाबेस प्लेग्राउंड[^]

कोड 2 में मैंने कुछ विथ और यूनियनों का उपयोग करने का प्रयास किया है लेकिन यह मुझे कुछ त्रुटि दे रहा है

Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.

मैंने क्या प्रयास किया है:

कोड 1

एसक्यूएल
SET ARITHABORT OFF
SET ANSI_WARNINGS OFF
SELECT coalesce((Select ((SUM( "IS_vwSalesbyProductLineComp"."sls_amt")-SUM( "IS_vwSalesbyProductLineComp"."cost_amt"))/SUM( "IS_vwSalesbyProductLineComp"."sls_amt"))*100 ),0) AS G1MTD,
	   "IS_vwSalesbyProductLineComp"."Mainslspsn_name",
	   "IS_vwSalesbyProductLineComp"."PCSummarized",
	   coalesce ((SELECT SUM("IS_vwSalesbyProductLineComp"."qty_to_ship"-"IS_vwSalesbyProductLineComp"."qty_return_to_stk")FROM "100"."dbo"."IS_vwSalesbyProductLineComp"
   where Year = 2021
   and Month between 1 and 12 Group by Mainslspsn_name,PCSummarized),0) AS Qty_Sold,
	   coalesce ((SELECT SUM("IS_vwSalesbyProductLineComp"."sls_amt")FROM "100"."dbo"."IS_vwSalesbyProductLineComp"
   where Year = 2021
   and Month between 1 and 12 Group by Mainslspsn_name,PCSummarized),0) AS YTD_Sales,
	   coalesce ((SELECT SUM("IS_vwSalesbyProductLineComp"."cost_amt")FROM "100"."dbo"."IS_vwSalesbyProductLineComp"
   where Year = 2021
   and Month between 1 and 12 Group by Mainslspsn_name,PCSummarized),0) AS YTD_COGS,
	   coalesce((Select ((SUM( "IS_vwSalesbyProductLineComp"."sls_amt")-SUM( "IS_vwSalesbyProductLineComp"."cost_amt"))/SUM( "IS_vwSalesbyProductLineComp"."sls_amt"))*100 
	   FROM "100"."dbo"."IS_vwSalesbyProductLineComp"
   where Year = 2021
   and Month between 1 and 12 Group by Mainslspsn_name,PCSummarized),0) AS G2YTD,
		SUM("IS_vwSalesbyProductLineComp"."qty_to_ship"-"IS_vwSalesbyProductLineComp"."qty_return_to_stk") 
		AS Qty_Sold,
   		SUM("IS_vwSalesbyProductLineComp"."sls_amt") 
		AS MTD_Sales,
      	SUM("IS_vwSalesbyProductLineComp"."cost_amt") 
		AS MTD_COGS   
   FROM "100"."dbo"."IS_vwSalesbyProductLineComp"
   where Year = 2021
   and Month = 12
   Group by Mainslspsn_name,PCSummarized
   order by PCSummarized

कोड 2

SET ARITHABORT OFF
SET ANSI_WARNINGS OFF
WITH 
T1 AS
(
SELECT (
       SELECT((SUM(IS_vwSalesbyProductLineComp.sls_amt) - SUM(IS_vwSalesbyProductLineComp.cost_amt)) / SUM(IS_vwSalesbyProductLineComp.sls_amt)) * 100) AS G1MTD, 
       IS_vwSalesbyProductLineComp.Mainslspsn_name, 
       IS_vwSalesbyProductLineComp.PCSummarized, 
       (
       SELECT SUM(IS_vwSalesbyProductLineComp.qty_to_ship - IS_vwSalesbyProductLineComp.qty_return_to_stk)
       FROM "100".dbo.IS_vwSalesbyProductLineComp
       WHERE Year = 2021
             AND Month BETWEEN 1 AND 12
       GROUP BY Mainslspsn_name, 
                PCSummarized) AS Qty_Sold, 
       (
       SELECT SUM(IS_vwSalesbyProductLineComp.sls_amt)
       FROM "100".dbo.IS_vwSalesbyProductLineComp
       WHERE Year = 2021
             AND Month BETWEEN 1 AND 12
       GROUP BY Mainslspsn_name, 
                PCSummarized) AS YTD_Sales, 
      (
       SELECT SUM(IS_vwSalesbyProductLineComp.cost_amt)
       FROM "100".dbo.IS_vwSalesbyProductLineComp
       WHERE Year = 2021
             AND Month BETWEEN 1 AND 12
       GROUP BY Mainslspsn_name, 
                PCSummarized) AS YTD_COGS, 
       (
       SELECT((SUM(IS_vwSalesbyProductLineComp.sls_amt) - SUM(IS_vwSalesbyProductLineComp.cost_amt)) / SUM(IS_vwSalesbyProductLineComp.sls_amt)) * 100
       FROM "100".dbo.IS_vwSalesbyProductLineComp
       WHERE Year = 2021
             AND Month BETWEEN 1 AND 12
       GROUP BY Mainslspsn_name, 
                PCSummarized) AS G2YTD, 
       SUM(IS_vwSalesbyProductLineComp.qty_to_ship - IS_vwSalesbyProductLineComp.qty_return_to_stk) AS Qty_Sold2, --> renamed because ambigous
       SUM(IS_vwSalesbyProductLineComp.sls_amt) AS MTD_Sales, 
       SUM(IS_vwSalesbyProductLineComp.cost_amt) AS MTD_COGS
FROM "100".dbo.IS_vwSalesbyProductLineComp
WHERE Year = 2021
      AND Month = 12
GROUP BY Mainslspsn_name, 
         PCSummarized
),
T2 AS 
(
SELECT 0 AS C1, '' AS C2, '' AS C3, 0 AS C4, 0 AS C5, 0 AS C6, 0 AS C7, 0 AS C8, 0 AS C9, 0 AS C10
),
T3 AS
(
SELECT * FROM T1
UNION 
SELECT * FROM T2
)
SELECT SUM(G1MTD) AS G1MTD, 
   (SELECT [text()] = Mainslspsn_name
       FROM "100".dbo.IS_vwSalesbyProductLineComp 
       FOR XML 
           PATH(''),
           TYPE
   ).value
     (
         './text()[1]', 
         'nvarchar(max)'
     ),
   (SELECT [text()] = PCSummarized
       FROM "100".dbo.IS_vwSalesbyProductLineComp 
       FOR XML 
           PATH(''),
           TYPE
   ).value
     (
         './text()[1]', 
         'nvarchar(max)'
     ),
       SUM(Qty_Sold) AS Qty_Sold,
       SUM(YTD_Sales) AS YTD_Sales,
       SUM(YTD_COGS) AS YTD_COGS,
       SUM(G2YTD) AS G2YTD,
       SUM(Qty_Sold2) AS Qty_Sold2,
       SUM(MTD_Sales) AS MTD_Sales,
       SUM(MTD_COGS) AS MTD_COGS
FROM T3
GROUP BY Mainslspsn_name, 
         PCSummarized
ORDER BY PCSummarized;

समाधान 1

किसी नमूना डेटा के अभाव में, इन बिंदुओं पर ध्यान देकर शुरुआत करें।

— 100.dbo.IS_vwSalesbyProductLineComp एक मान्य SQL पहचानकर्ता नहीं है। SQL पहचानकर्ता को एक अक्षर या अंडरस्कोर से शुरू होना चाहिए

– यदि आप केवल एक तालिका से चयन कर रहे हैं तो आपको कॉलम में तालिका नाम को अर्हता प्राप्त करने की आवश्यकता नहीं है

– यदि आप कॉलम को योग्य बनाने जा रहे हैं तो स्क्रिप्ट को अधिक पठनीय बनाने के लिए पूर्ण तालिका नाम के बजाय उपनाम का उपयोग करें उदाहरण के लिए

एसक्यूएल
select IS_vwSalesbyProductLineComp.sls_amt
from IS_vwSalesbyProductLineComp

उपयोग

एसक्यूएल
select splc.sls_amt 
from IS_vwSalesbyProductLineComp splc

– कॉलम और टेबल नामों पर सीमांकक से छुटकारा पाएं – वे आवश्यक नहीं हैं और बस आपकी क्वेरी को अपठनीय बनाते हैं

— यदि आप डिलीमीटर का उपयोग करते हैं तो उपयोग करें [ ] यानी की बजाय "IS_vwSalesbyProductLineComp" उपयोग [IS_vwSalesbyProductLineComp] – फिर, यह अधिक पठनीय है

— तुम्हारा बयान

उद्धरण:

लेकिन डेटा सटीकता के लिए मुझे इसे एक SQL कथन में संयोजित करने की आवश्यकता है

मान्य नहीं है। उपयोग किए गए SQL कथनों की संख्या का डेटा सटीकता पर कोई प्रभाव नहीं पड़ता है। सब कुछ एक ही कथन में समाहित करने का जुनून स्पष्टता, सटीकता (आपकी स्क्रिप्ट की, डेटा की नहीं) और प्रदर्शन के लिए हानिकारक हो सकता है।

– उन सभी उप-प्रश्नों की बिल्कुल आवश्यकता नहीं है – साथ ही, जैसा कि आपने देखा है, आपको कई पंक्तियाँ वापस मिल रही हैं

आपको आवश्यक सभी डेटा को अलग-अलग पंक्तियों में प्राप्त करें – यदि आप इस पर जोर देते हैं कि यह एक एकल SQL कथन है तो कॉमन टेबल एक्सप्रेशन (CTE -) का उपयोग करें साथ में Common_table_expression (Transact-SQL) – SQL सर्वर | माइक्रोसॉफ्ट डॉक्स[^] ).

तब धुरी उन परिणामों को वह तालिका प्राप्त करने के लिए जो आप चाहते हैं – देखें SQL सर्वर PIVOT ऑपरेटर को व्यावहारिक उदाहरणों द्वारा स्पष्ट रूप से समझाया गया[^]

समाधान 2

पहली नज़र में… आपकी क्वेरी सचमुच ख़राब है:
सबसे महत्वपूर्ण गलती यह है: बहुत सारे चयन!
आपके पास 1 मुख्य है SELECT और फिर 4 उप-SELECT!

कम संख्या में उपयोग करने में सक्षम होने के लिए अपनी क्वेरी को दोबारा लिखने का प्रयास करें SELECT.
हर एक सबक्वेरी की जाँच करें। यदि इसमें से कोई भी एक से अधिक रिकॉर्ड लौटाता है, तो आपको उस क्वेरी में सुधार करना होगा।

इस बीच, कृपया इसे पढ़ें: SQL सर्वर में संदेश 512 “सबक्वेरी ने 1 से अधिक मान लौटाया” को ठीक करें[^]

समाधान 5

https://www.google.com/search?q=standale+to+Hometown+Water+Fire+Restoration
हालाँकि बढ़िया पोस्ट, मैं सोच रहा था कि क्या आप इस विषय पर कुछ और लिख सकते हैं?
यदि आप थोड़ा और विस्तार से बता सकें तो मैं बहुत आभारी रहूँगा।

प्रोत्साहित करना!

コメント

タイトルとURLをコピーしました