स्तंभ नामों को गतिशील रूप से UNPIVOT के लिए


10

मेरे पास निम्नलिखित डेटा वाली एक तालिका है

First         Second        Third         Fourth        Fifth         Sixth
2013-08-20    2013-08-21    2013-08-22    2013-08-23    2013-08-24    2013-08-25

और उपयोग कर रहा है UNPIVOT

SELECT Data
    ,DATENAME(DW, Data) AS DayName
FROM Cal
UNPIVOT(Data FOR D IN (
            First,
            Second,
            Third,
            Fourth,
            Fifth,
            Sixth  )) AS unpvt

मुझे निम्नलिखित परिणाम मिले

Data        DayName
2013-08-20  Tuesday
2013-08-21  Wednesday
2013-08-22  Thursday
2013-08-23  Friday
2013-08-24  Saturday
2013-08-25  Sunday

अब मेरा प्रश्न यह है कि क्या हम स्तंभ नामों को गतिशील रूप से पास कर सकते हैं UNPIVOTताकि जब तालिका में कॉलम बढ़े तो हमें कथन को बदलना न पड़े।

जवाबों:


14

यदि आपके पास अज्ञात संख्या में कॉलम होने वाले हैं, तो आपको अनप्राइव करने की आवश्यकता होगी, तो आपको गतिशील एसक्यूएल को लागू करना होगा।

आप sys.columnsअपनी calतालिका के सभी स्तंभों के नाम प्राप्त करने के लिए उपयोग कर सकते हैं । यदि आप निम्नलिखित क्वेरी का उपयोग करते हैं, तो आपको अपनी तालिका के सभी स्तंभों की सूची मिल जाएगी:

select C.name
from sys.columns c
where c.object_id = OBJECT_ID('dbo.cal') 

अब आप इस क्वेरी का उपयोग FOR XML PATHकरने के लिए एक स्ट्रिंग को संक्षिप्त करने के लिए नामों की अल्पविराम से अलग की गई सूची बना सकते हैं :

select @colsUnpivot 
  = stuff((select ','+quotename(C.name)
           FROM sys.columns c
           WHERE c.object_id = OBJECT_ID('dbo.cal') 
           for xml path('')), 1, 1, '')

अंत में, आप इस सूची को ले लेंगे और इसे अपने क्वेरी स्ट्रिंग में डाल देंगे ताकि निष्पादित पूरी क्वेरी की तरह दिखाई दे:

DECLARE @colsUnpivot AS NVARCHAR(MAX),
   @query  AS NVARCHAR(MAX)

select @colsUnpivot 
  = stuff((select ','+quotename(C.name)
           FROM sys.columns c
           WHERE c.object_id = OBJECT_ID('dbo.cal') 
           for xml path('')), 1, 1, '')

set @query 
  = 'select data, datename(dw, data) dayname
     from cal
     unpivot
     (
        data
        for d in ('+ @colsunpivot +')
     ) u'

exec sp_executesql @query;

SQL फिडेल को डेमो के साथ देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.