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

SQL सर्वर:कॉलम में पंक्तियाँ

मेरा सुझाव है कि जब आप डायनेमिक एसक्यूएल के साथ काम कर रहे हों तो हमेशा पहले हार्ड-कोडेड क्वेरी लिखें, ताकि आप लॉजिक को सही कर सकें, फिर इसे डायनेमिक एसक्यूएल में बदल सकें।

चूंकि आप डेटा के 3 कॉलम पिवट करने का प्रयास कर रहे हैं, इसलिए मैं पहले type_ds को अनपिवट करूंगा , expdt और comdt` कॉलम, फिर PIVOT फ़ंक्शन लागू करें।

क्वेरी का हार्ड-कोडेड संस्करण होगा:

SELECT  *
FROM    
(   
  select pro_id,
    type_ds = case 
                when col ='type_ds' 
                then type_ds 
                else type_ds+col end,
    value
  from
  (
     SELECT A.Pro_Id,
       c.Type_DS,
       convert(varchar(10), b.ExpDt, 120) ExpDt, 
       convert(varchar(10), b.ComDt, 120) ComDt
     FROM  dbo.Project A  
     left join [dbo].[Prj_App] B 
        on A.Pro_id = B.Pro_Id
     right outer join dbo.Approval_Type C 
        on B.App_Id = C.App_ID
   ) s
   cross apply
   (
      select 'type_ds', type_ds union all
      select 'expdt', expdt union all
      select 'comdt', comdt
   ) c (col, value)
) data
PIVOT
(   
  MAX(value)
  FOR Type_DS IN (RMC2, RMC2expdt, RMC2comdt,
                   RMC1, RMC1expdt, RMC1comdt) 
) pvt1                                        

देखें SQL Fiddle with Demo . अब जब आपके पास क्वेरी का कार्यशील संस्करण है, तो आप इसे आसानी से डायनेमिक SQL में बदल सकते हैं:

DECLARE @SQL1 NVARCHAR(MAX) = ''
DECLARE @SQL NVARCHAR(MAX) = ''

SELECT  @SQL1 = STUFF((SELECT ',' + QUOTENAME(Type_Ds) + ',' +  QUOTENAME(Type_Ds + 'ExpDt') + ',' + QUOTENAME(Type_Ds + 'ComDt')
                    from dbo.Approval_Type 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')   


SET @SQL = 'SELECT  *
            FROM    
            (   
              select pro_id,
                type_ds = case 
                            when col =''type_ds'' 
                            then type_ds 
                            else type_ds+col end,
                value
              from
              (
                 SELECT A.Pro_Id,
                   c.Type_DS,
                   convert(varchar(10), b.ExpDt, 120) ExpDt, 
                   convert(varchar(10), b.ComDt, 120) ComDt
                 FROM  dbo.Project A  
                 left join [dbo].[Prj_App] B 
                    on A.Pro_id = B.Pro_Id
                 right outer join dbo.Approval_Type C 
                    on B.App_Id = C.App_ID
               ) s
               cross apply
               (
                  select ''type_ds'', type_ds union all
                  select ''expdt'', expdt union all
                  select ''comdt'', comdt
               ) c (col, value)
           ) data
           PIVOT
           (   
              MAX(value)
              FOR Type_DS IN (' + @SQL1 + ') 
           ) pvt1 '

--print @SQL
EXECUTE SP_EXECUTESQL @SQL

देखें SQL Fiddle with Demo




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. टी-एसक्यूएल और WHERE LIKE% पैरामीटर% क्लॉज

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

  3. सिग्नलआर के साथ SQL सर्वर से वेब एप्लिकेशन पर डेटा पुश करना

  4. SQL-CLR ट्रिगर या संग्रहीत कार्यविधि के अंदर सॉकेट बनाना

  5. डेटाबेस में कहीं भी एक मूल्य खोजें