2015-01-30 21 views
5

एसक्यूएल सर्वर 2008 में, मैं 3 कॉलम युक्त तालिका (tblStock) है परिणाम नीचे प्राप्त करें?पंक्ति और स्तंभ की कुल

PartCode WHs-A WHs-B WHs-C WHs-D WHs-E WHs-F Total 
........ ..... ..... ..... ...... ..... ..... ..... 
A   10  1  9  0  0  0  20 
B   22  0  0  0  0  0  22 
C   20  0  0  0  0  0  20 
D    2  0  0  0  0  39  41 
E    0  0  0  3  0  0  3 
F    7  0  0  0  54  0  61 
Total  61  1  9  3  54  39  167 

आपकी मदद बहुत सराहना की है, धन्यवाद।

उत्तर

9

नमूना तालिका

SELECT * INTO #tblStock 
FROM 
(
SELECT 'A' PartCode, 10 StockQty, 'WHs-A' Location 
UNION ALL 
SELECT 'B', 22, 'WHs-A' 
UNION ALL 
SELECT 'A', 1, 'WHs-B' 
UNION ALL 
SELECT 'C', 20, 'WHs-A' 
UNION ALL 
SELECT 'D', 39, 'WHs-F' 
UNION ALL 
SELECT 'E', 3, 'WHs-D' 
UNION ALL 
SELECT 'F', 7, 'WHs-A' 
UNION ALL 
SELECT 'A', 9, 'WHs-C' 
UNION ALL 
SELECT 'D', 2, 'WHs-A' 
UNION ALL 
SELECT 'F', 54, 'WHs-E' 
)TAB 

गतिशील पिवट के लिए कॉलम जाओ और zero

DECLARE @cols NVARCHAR (MAX) 

SELECT @cols = COALESCE (@cols + ',[' + Location + ']', '[' + Location + ']') 
       FROM (SELECT DISTINCT Location FROM #tblStock) PV 
       ORDER BY Location 
-- Since we need Total in last column, we append it at last 
SELECT @cols += ',[Total]' 


--Varible to replace NULL with zero 
DECLARE @NulltoZeroCols NVARCHAR (MAX) 

SELECT @NullToZeroCols = SUBSTRING((SELECT ',ISNULL(['+Location+'],0) AS ['+Location+']' 
FROM (SELECT DISTINCT Location FROM #tblStock)TAB 
ORDER BY Location FOR XML PATH('')),2,8000) 

SELECT @NullToZeroCols += ',ISNULL([Total],0) AS [Total]' 

साथ NULL की जगह आप CUBE का उपयोग पंक्ति और स्तंभ की कुल खोजने के लिए कर सकते हैं और साथ NULL की जगह से उत्पन्न पंक्तियों के लिए TotalCUBENULL बजाय 0 में से यदि आप चाहते हैं:

परिणाम

enter image description here

नोट परिणाम

DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT PartCode,' + @NulltoZeroCols + ' FROM 
      (
       SELECT 
       ISNULL(CAST(PartCode AS VARCHAR(30)),''Total'')PartCode, 
       SUM(StockQty)StockQty , 
       ISNULL(Location,''Total'')Location    
       FROM #tblStock 
       GROUP BY Location,PartCode 
       WITH CUBE 
      ) x 
      PIVOT 
      (
       MIN(StockQty) 
       FOR Location IN (' + @cols + ') 
      ) p 
      ORDER BY CASE WHEN (PartCode=''Total'') THEN 1 ELSE 0 END,PartCode' 

EXEC SP_EXECUTESQL @query 
  • Click here देखने परमूल्यों के रूप में, गतिशील धुरी कोड में @cols बजाय @NulltoZeroCols का उपयोग

    संपादित करें:

    1. दिखाएँ केवल कुल

    • कोड SELECT @cols += ',[Total]' और SELECT @NullToZeroCols += ',ISNULL([Total],0) AS [Total]' का प्रयोग न करें पंक्ति।
    • CUBE के बजाय ROLLUP का उपयोग करें।

    enter image description here

    2. दिखाएँ केवल स्तंभ कुल

    • उपयोग कोड SELECT @cols += ',[Total]' और SELECT @NullToZeroCols += ',ISNULL([Total],0) AS [Total]'
    • CUBE के बजाय ROLLUP का उपयोग करें।
    • GROUP BY Location,PartCode से GROUP BY PartCode,Location बदलें।
    • ORDER BY CASE WHEN (PartCode=''Total'') THEN 1 ELSE 0 END,PartCode के बजाय, WHERE PartCode<>''TOTAL'' ORDER BY PartCode का उपयोग करें।

    enter image description here

    अद्यतन: ओपी

    मैं परिणाम के साथ PartName जोड़ने के लिए नीचे दिए गए क्वेरी को अद्यतन करने के लिए कर रहा हूँ PartName लाने के लिए। चूंकि PartNameCUBE के साथ अतिरिक्त परिणाम जोड़ देगा और AND या OR स्थितियों में भ्रम से बचने के लिए, आपके स्रोत तालिका में DISTINCT मानों के साथ पिवोट किए गए परिणाम में शामिल होना बेहतर होगा।

    DECLARE @query NVARCHAR(MAX) 
    SET @query = 'SELECT P.PartCode,T.PartName,' + @NulltoZeroCols + ' FROM 
          (    
           SELECT 
           ISNULL(CAST(PartCode AS VARCHAR(30)),''Total'')PartCode, 
           SUM(StockQty)StockQty , 
           ISNULL(Location,''Total'')Location    
           FROM #tblStock 
           GROUP BY Location,PartCode 
           WITH CUBE     
          ) x 
          PIVOT 
          (
           MIN(StockQty) 
           FOR Location IN (' + @cols + ') 
          ) p 
          LEFT JOIN 
          ( 
           SELECT DISTINCT PartCode,PartName 
           FROM #tblStock 
          )T 
          ON P.PartCode=T.PartCode 
          ORDER BY CASE WHEN (P.PartCode=''Total'') THEN 1 ELSE 0 END,P.PartCode' 
    
    EXEC SP_EXECUTESQL @query 
    

    enter image description here

+0

मैंने आपके समाधान और स्पष्टीकरण के लिए @Soka –

+0

अपडेट किया है, वास्तव में मुझे क्या चाहिए, धन्यवाद @ सरथ अवानावु। – Sokea

+0

आपका स्वागत है :) @ सोका –

1

आप प्राप्त करने के लिए total पंक्ति का उपयोग union

मामले में Location मूल्यों अग्रिम में नहीं जाना जाता है case based aggregation उपयोग करने के लिए डेटा

पिवट करने के लिए की जरूरत है, तो आप एक dynamic query

आप का निर्माण करने की जरूरत है ऐसा करने के लिए pivot कीवर्ड का भी उपयोग कर सकते हैं।

select partCode, 
sum(case when Location='WHs-A' then StockQty 
     else 0 end 
    ) as 'Whs-A', 
sum(case when Location='WHs-B' then StockQty 
     else 0 end 
    ) as 'Whs-B', 
sum(StockQty) as 'Total' 
from tblStock 
group by partCode 
union all 
select 'Total' as 'partCode', 
sum(case when Location='WHs-A' then StockQty 
    else 0 end) as 'Whs-A', 
sum(case when Location='WHs-B' then StockQty 
    else 0 end) as 'Whs-B', 
sum(StockQty) as 'Total' 
from tblStock 
+1

धन्यवाद रडार देखने पर। वैसे भी स्थान अज्ञात कॉलम है, क्या आप pls कर सकते हैं। गतिशील क्वेरी प्रदान करें? – Sokea

संबंधित मुद्दे