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

एसक्यूएल:गतिशील पिवट के साथ ISNULL का उपयोग करना

मैं आपकी क्वेरी को थोड़ा अलग सेट कर दूंगा क्योंकि यह गतिशील है कि कॉलम नाम बदल रहे हैं, फिर भी आपने कॉलम की संख्या को हार्ड-कोड किया है।

सबसे पहले, मैं उन महीनों/वर्षों की सूची तैयार करने के लिए एक पुनरावर्ती सीटीई का उपयोग करूंगा जिन्हें आप बनाना चाहते हैं।

DECLARE @startDate datetime

SET @startDate = '2013-01-01'

;with dates as
(
  select @startdate datelist, 1 sp
  union all
  select dateadd(month, 1, datelist), sp+1
  from dates
  where sp+1 <= 5 -- change this number 5 to the number of months you need
)
select   sp,
  REPLACE(SUBSTRING(CONVERT(varchar(11), datelist, 13), 4, 8), ' ', '') MONTHANDYEAR
from dates

देखें SQL Fiddle with Demo . यह स्वचालित रूप से वर्ष के साथ आपकी 5 महीनों की सूची बनाने जा रहा है। तब आप 5 कॉलम को हार्ड-कोडिंग नहीं कर रहे हैं। आपकी वर्तमान क्वेरी उतनी लचीली नहीं है जितनी हो सकती है। क्या होगा यदि आप 12 महीने चाहते हैं, तो आपको अपना कोड बदलना होगा।

एक बार जब आप तिथियों की सूची तैयार कर लेंगे, तो मैं इसे एक अस्थायी तालिका में डाल दूंगा ताकि आप कॉलम प्राप्त करने के लिए इसका उपयोग कर सकें।

कॉलम की सूची प्राप्त करने के लिए कोड है:

select @cols = STUFF((SELECT ',' + QUOTENAME(monthandyear) 
                    from #datesTemp
                    group by monthandyear, sp
                    order by sp
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colNames = STUFF((SELECT  ', isnull(' + QUOTENAME(monthandyear)+', 0) as '+QUOTENAME(monthandyear)
                    from #datesTemp
                    group by monthandyear, sp
                    order by sp
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

देखें SQL Fiddle with Demo . आप देखेंगे कि इसके दो संस्करण हैं। पहला वाला @cols उन स्तंभों की सूची प्राप्त करता है जिनका उपयोग pivot . में किया जाएगा . दूसरा @colNames अंतिम SELECT . में उपयोग किया जाएगा null . को बदलने के लिए सूची शून्य के साथ मान।

फिर आप इसे सब एक साथ रखें और कोड होगा:(नोट:मैं आपके उत्तर के एक संस्करण का उपयोग कर रहा हूं पिछला प्रश्न )

DECLARE @cols AS NVARCHAR(MAX),
    @colNames AS NVARCHAR(MAX),
    @query AS NVARCHAR(MAX),
    @startDate datetime

SET @startDate = '2013-01-01'

;with dates as
(
  select @startdate datelist, 1 sp
  union all
  select dateadd(month, 1, datelist), sp+1
  from dates
  where sp+1 <= 5 -- change this number 5 to the number of months you need
)
select   sp,
  REPLACE(SUBSTRING(CONVERT(varchar(11), datelist, 13), 4, 8), ' ', '') MONTHANDYEAR
into #datesTemp
from dates

select @cols = STUFF((SELECT ',' + QUOTENAME(monthandyear) 
                    from #datesTemp
                    group by monthandyear, sp
                    order by sp
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colNames = STUFF((SELECT  ', isnull(' + QUOTENAME(monthandyear)+', 0) as '+QUOTENAME(monthandyear)
                    from #datesTemp
                    group by monthandyear, sp
                    order by sp
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT resource, clientname,' + @colNames + ' 
             from 
             (
                select [CLIENTNAME], [RESOURCE], [FORECASTTOTAL],
                   REPLACE(SUBSTRING(CONVERT(varchar(11), SCHEDULEDDATE, 13), 4, 8), '' '', '''') monthandyear
                from viewprojscheduling_group
            ) x
            pivot 
            (
                sum(FORECASTTOTAL)
                for monthandyear in (' + @cols + ')
            ) p '

execute(@query)

देखें SQL Fiddle with Demo . यह प्रश्न आपको परिणाम देगा:

| RESOURCE | CLIENTNAME | JAN2013 | FEB2013 | MAR2013 | APR2013 | MAY2013 |
---------------------------------------------------------------------------
|     res1 |        abc |    1000 |    2000 |       0 |       0 |       0 |
|     res1 |        def |       0 |       0 |    2000 |       0 |       0 |
|     res2 |        def |    1500 |       0 |       0 |       0 |       0 |
|     res3 |        ghi |       0 |       0 |    2500 |       0 |       0 |



  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. एसक्यूएल सर्वर (टीएसक्यूएल) - क्या समानांतर में बयानों को EXEC करना संभव है?

  3. मैं SQL सर्वर प्रोफाइलर में SQL सर्वर क्वेरी के लिए पैरामीटर मान कैसे प्राप्त करूं?

  4. SQL सर्वर 2005 संख्यात्मक सटीक हानि

  5. फ़ाइल की जाँच करें sql सर्वर में मौजूद है या नहीं?