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

एसक्यूएल में साल के लिए टेबल पिवट कैसे करें?

आपको अपने प्रत्येक दिनांक मान के लिए वर्ष प्राप्त करना होगा और फिर उन मानों पर PIVOT करना होगा। इसे प्राप्त करने के लिए आप SQL सर्वर में कुछ भिन्न कार्यों का उपयोग कर सकते हैं।

  • DatePart - सिंटैक्स होगा DatePart(year, yourDate)
  • वर्ष - सिंटैक्स Year(yourDate) . है

इनमें से कोई एक प्रत्येक तिथि के लिए वर्ष लौटाएगा, फिर आप वर्षों को अपने PIVOT में नए कॉलम के रूप में रखेंगे।

select plate, [2011], [2012], [2013], [2014], [2015], [2016], [2017]
from
(
  SELECT tnk.Plate, 
     Cast(mua.Tarih as Date) as M_Date,
     year(mua.Tarih) yr
  FROM Muayene mua 
  LEFT JOIN Tanker tnk 
    on (tnk.OID=mua.TankerId)
) d
pivot
(
  max(m_date)
  for yr in ([2011], [2012], [2013], [2014], [2015], [2016], [2017])
) piv;

देखें डेमो . आप देखेंगे कि इस क्वेरी में मैंने mua.Id . कॉलम हटा दिया है . ऐसा इसलिए है क्योंकि जब आप डेटा पिवट करते हैं तो आप अपनी क्वेरी में प्रत्येक कॉलम द्वारा समूहित करेंगे, क्योंकि ये मान अलग हैं, इसलिए आप अलग-अलग पंक्तियां लौटाएंगे। अपनी क्वेरी से कॉलम हटाकर, आप एक परिणाम देंगे:

|    PLATE |       2011 |   2012 |   2013 |       2014 |       2015 |       2016 |       2017 |
|----------|------------|--------|--------|------------|------------|------------|------------|
| 34VM7969 | 2011-08-02 | (null) | (null) | 2014-08-08 | 2015-02-21 | 2016-08-19 | 2017-03-09 |

अंत में, यदि आपके पास अज्ञात तिथियां होने वाली हैं, तो मैं 2 चीजों का सुझाव दूंगा - एक कैलेंडर तालिका और फिर गतिशील SQL का उपयोग करें।

तब कैलेंडर तालिका केवल तिथियों की एक सूची है जिसका उपयोग आप निम्न के समान क्वेरी करने के लिए कर सकते हैं:

create table calendar
(
  date datetime
);

insert into calendar
select '2011-01-01' union all
select '2012-01-01' union all
select '2013-01-01' union all
select '2014-01-01' union all
select '2015-01-01' union all
select '2016-01-01' union all
select '2016-01-01' union all
select '2017-01-01' union all
select '2018-01-01' 

फिर आप एक sql स्ट्रिंग में वर्षों की एक सूची बनाएंगे और उस स्ट्रिंग को निष्पादित करेंगे, जैसा कि:

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

select @cols = STUFF((SELECT ',' + QUOTENAME(year(date)) 
                    from calendar
                    group by year(date)
                    order by year(date)
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT plate, ' + @cols + ' 
            from 
            (
              select plate, 
                m_Date = convert(varchar(10), m_date, 120), 
                year(m_date) yr
              from yourquery
            ) x
            pivot 
            (
                max(m_date)
                for yr in (' + @cols + ')
            ) p '

execute 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. अगर नाम मौजूद है तो अपडेट करें और डालें - SQL सर्वर में

  2. दिनांक सीमा ओवरलैपिंग चेक बाधा

  3. एसक्यूएल सर्वर में नियमित अभिव्यक्ति का उपयोग कैसे करें?

  4. परपेचुअल वेटेड एवरेज कॉस्ट कैलकुलेशन SQL Server 2008

  5. रिपोर्टसर्वर इंस्टेंस पर *सभी* SSRS रिपोर्ट में *सभी* SSRS डेटासेट की सूची खोजने के लिए क्वेरी