Convert Rows to columns using 'Pivot' in mssql when columns are string data type

前端 未结 3 1700
情深已故
情深已故 2020-12-16 04:10

I need to know whether \'pivot\' in MS SQL can be used for converting rows to columns if there is no aggregate function to be used. i saw lot of examples with aggregate func

相关标签:
3条回答
  • 2020-12-16 04:18

    You can use a PIVOT to perform this operation. When doing the PIVOT you can do it one of two ways, with a Static Pivot that you will code the rows to transform or a Dynamic Pivot which will create the list of columns at run-time:

    Static Pivot (see SQL Fiddle with a Demo):

    SELECT *
    FROM
    (
      select empid, wagecode, amount
      from t1
    ) x
    pivot
    (
      sum(amount)
      for wagecode in ([basic], [TA], [DA])
    ) p
    

    Dynamic Pivot:

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX);
    
    select @cols = STUFF((SELECT distinct ',' + QUOTENAME(wagecode) 
                      FROM t1 
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = 'SELECT empid, ' + @cols + ' from 
                 (
                     select empid, wagecode, amount
                     from t1
                ) x
                pivot 
                (
                    sum(amount)
                    for wagecode in (' + @cols + ')
                ) p '
    
    execute(@query)
    

    Both of these will give you the same results

    0 讨论(0)
  • 2020-12-16 04:21

    sample format

    empid     wagecode    amount
    1              basic           1000
    1              TA               500
    1              DA               500
    2              Basic           1500
    2              TA               750
    2              DA               750

    empid      basic       TA        DA
    1            1000         500      500
    2            1500         750       750

    THE ANSWER I GOT IS

       SELECT empID , [1bas] as basic, [1tasal] as TA,[1otsal] as DA
       FROM (
       SELECT empID, wage, amount
       FROM table) up
       PIVOT (SUM(amt) FOR wgcod IN ([1bas], [1tasal],[1otsal])) AS pvt
       ORDER BY empID 
       GO
    
    0 讨论(0)
  • 2020-12-16 04:33

    Try this:

    SELECT empid AS EmpID     
    , ISNULL(SUM(CASE wagecode WHEN 'basic' THEN Amount ELSE 0 END), 0) AS Basic         
    , ISNULL(SUM(CASE wagecode WHEN 'ta' THEN Amount ELSE 0 END), 0) AS TA     
    , ISNULL(SUM(CASE wagecode WHEN 'da' THEN Amount ELSE 0 END), 0) AS DA 
    FROM Employee
    GROUP BY empid 
    
    0 讨论(0)
提交回复
热议问题