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

पंक्तियों की संख्या के आधार पर कई पंक्तियों को एक पंक्ति में जोड़ना और स्तंभों को जोड़ना

आप DynamicSQL के साथ विकल्प का उपयोग कर सकते हैं, APPLY( ) और PIVOT ऑपरेटरों। इस परिदृश्य में कॉलम कॉलम 4 द्वारा क्रमबद्ध परिणामों में कॉलम क्रम।

DECLARE @cols nvarchar(max),
        @query nvarchar(max)
SELECT @cols = 
  STUFF((SELECT x.ColName
         FROM (
               SELECT ',' + QUOTENAME('Col' + CAST(3 + ROW_NUMBER() OVER(PARTITION BY Col1, Col2, Col3 ORDER BY Col4) AS nvarchar(10))) AS ColName,
                      ROW_NUMBER() OVER(PARTITION BY Col1, Col2, Col3 ORDER BY Col4) AS rn
               FROM dbo.test31 CROSS APPLY (VALUES('Col'), ('Col'), ('Col')) o(Col)) x
         GROUP BY x.ColName, x.rn
         ORDER BY x.rn                   
         FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'), 1, 1, '')
SET @query = 
  'SELECT * FROM 
    (      
     SELECT t.Col1, t.Col2, t.Col3,            
            ''Col'' + CAST(3 + ROW_NUMBER() OVER(PARTITION BY t.Col1, t.Col2, t.Col3 ORDER BY t.Col4) AS nvarchar(10)) AS ColName,            
            COALESCE(CAST(o.oCol4 AS nvarchar(10)), o.oCol5, o.oCol6) AS ListValues            
     FROM dbo.test31 t CROSS APPLY (
                                    SELECT oCol4, oCol5, oCol6
                                    FROM (VALUES (t.Col4, NULL, NULL),
                                                 (NULL, t.Col5, NULL),
                                                 (NULL, NULL, t.Col6))
                                    x(oCol4, oCol5, oCol6)
                                    ) o
     ) x
     PIVOT
      (
       MAX(ListValues) FOR ColName IN(' + @cols + ')
       ) p'
EXEC (@query)

SQLFiddle पर डेमो

इस तरह के कॉलम नाम वाला विकल्प "प्लांट, ब्रांड, एरिया 1, डाउनटाइम 1, कारण1, क्षेत्र 2, डाउनटाइम 2, कारण 2 और इसी तरह।"

DECLARE @cols nvarchar(max),
        @query nvarchar(max)
SELECT @cols = 
  STUFF((SELECT ',' + QUOTENAME(o.Col) AS ColName                
         FROM
          (
           SELECT *, CAST(ROW_NUMBER() OVER(PARTITION BY Plant, Brand ORDER BY Area) AS nvarchar(10)) AS rn
           FROM dbo.test35) t CROSS APPLY (VALUES('Area' + t.rn), ('DownTime' + t.rn), ('Reasons' + t.rn)
           ) o(Col)
         GROUP BY o.Col, t.rn
         ORDER BY t.rn                   
         FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'), 1, 1, '')       

SET @query = 
  'SELECT * FROM 
    (      
     SELECT t.Plant, t.Brand, o.ColName,            
            COALESCE(CAST(o.Area AS nvarchar(10)), o.DownTime, o.Reasons) AS ListValues
     FROM
      (
       SELECT Plant, Brand, Area, DownTime, Reasons,
              CAST(ROW_NUMBER() OVER(PARTITION BY Plant, Brand ORDER BY Area) AS nvarchar(10)) AS rn            
       FROM dbo.test35) t CROSS APPLY (
                                      SELECT Area, DownTime, Reasons, ColName
                                      FROM (VALUES (t.Area, NULL, NULL, ''Area'' + t.rn),
                                                   (NULL, t.DownTime, NULL, ''DownTime'' + t.rn),
                                                   (NULL, NULL, t.Reasons, ''Reasons'' + t.rn))
                                      x(Area, DownTime, Reasons, ColName)
                                      ) o
      ) x
     PIVOT
      (
       MAX(ListValues) FOR ColName IN(' + @cols + ')
       ) p'
EXEC (@query) 

SQLFiddle पर डेमो




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक प्रश्न के अंत में newid () क्यों अमल में आता है?

  2. कई पंक्तियों को जोड़ना

  3. मैं कई तिथियों से सप्ताहांत के दिनों की गिनती कैसे प्राप्त करूं

  4. SQL सर्वर में डेटाबेस इंडेक्स डिज़ाइन के लिए शीर्ष पाँच विचार

  5. आप टेबल-वैल्यू फ़ंक्शन का उपयोग कब करेंगे?