Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

डायनेमिक पिवट में कुल रो और कॉलम

नमूना तालिका

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

डायनेमिक पिवोटिंग के लिए कॉलम प्राप्त करें और NULL को बदलें 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]'

आप CUBE . का उपयोग कर सकते हैं पंक्ति और स्तंभ का कुल योग ढूँढ़ने और NULL को बदलने के लिए Total . के साथ CUBE . से उत्पन्न पंक्तियों के लिए .

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

परिणाम

नोट:यदि आप NULL चाहते हैं zero . के बजाय मान के रूप में, @cols . का उपयोग करें @NulltoZeroCols . के बजाय गतिशील पिवट कोड में

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

<मजबूत>1. केवल कुल पंक्ति दिखाएं

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

<मजबूत>2. केवल कुल कॉलम दिखाएं

  • कोड का उपयोग करें SELECT @cols += ',[Total]' और SELECT @NullToZeroCols += ',ISNULL([Total],0) AS [Total]'
  • ROLLUP का उपयोग करें CUBE . के बजाय ।
  • बदलें 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 का उपयोग करें ।

अद्यतन करें:PartName लाने के लिए ओपी के लिए

मैं PartName जोड़ने के लिए नीचे दी गई क्वेरी को अपडेट कर रहा हूं परिणाम के साथ। चूंकि PartName CUBE . के साथ अतिरिक्त परिणाम जोड़ देगा और 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. लॉगिन के बिना बनाए गए उपयोगकर्ता को लॉगिन असाइन करें (एसक्यूएल सर्वर)

  2. SQL सर्वर (T-SQL उदाहरण) में 'स्मॉलडेटटाइम' को 'डेटाटाइम' में बदलें

  3. सशर्त विभिन्न तालिकाओं में शामिल हों

  4. SQL सर्वर में डेटाटाइम सम्मिलित करने के लिए Sql क्वेरी

  5. मैं SQL सर्वर में लिंक किए गए डेटाबेस सर्वर कैसे बनाऊं और क्वेरी करूं?