简体   繁体   中英

need help in pivoting a data?

First of all, I am new to SQL. Here is the sample (for both table1 and table2 , I have created a SNO as primary key and it's also identity column)

Table1 :

PID  PNAME    PartID
---  -----    ------
0    Length   1
1    Breadth  1
2    Height   1
0    Area     2
1    Volume   2

Table2 :

SampleID  PID  Pvalue  PartID  ModifiedDate  Operator
--------  ---  ------  ------  ------------  --------
0         0    10      1       10-Mar-14     Test
0         1    10      1       10-Mar-14     Test
0         2    Fail    1       10-Mar-14     Test
1         0    20      1       12-Mar-14     Test
1         1    Fail    1       12-Mar-14     Test
1         2    Fail    1       12-Mar-14     Test
0         0    10      2       13-Mar-14     Test1
0         1    10      2       13-Mar-14     Test1

Depending upon the PartID , I must get the following results

PARTID: 1

PNAME         0          1
------------  ---------  ---------
Length        10         20
Breadth       10         Fail
Height        Fail       Fail
ModifiedDate  10-Mar-14  12-Mar-14
Operator      Test       Test

PARTID: 2

PNAME         0
------------  ---------
Area          10
Volume        10
ModifiedDate  13-Mar-14
Operator      Test1

How to achieve the desired output as mentioned above in SQL Server 2008?

You can use PIVOT to get the result but you will also need to unpivot the ModifiedDate and Operator columns so you can display them in a single column with the PName . Your final result will need a dynamic solution but it would be much easier to write this static first, then convert to dynamic sql.

The basic syntax will be:

select pname, [0], [1]
from
(
  select t2.sampleid, pname = c.col, c.value
  from table1 t1
  inner join table2 t2
    on t1.partid = t2.partid
    and t1.pid = t2.pid
  cross apply
  (
    select Pname, pvalue union all
    select 'ModifiedDate', convert(varchar(10), ModifiedDate, 120) union all
    select 'Operator', Operator
  ) c (col, value)
  where t1.partid = 1
) d
pivot
(
  max(value)
  for sampleid in ([0], [1])
) p;

See SQL Fiddle with Demo . You'll see that I used CROSS APPLY to convert the 3 columns PName , ModifiedDate and Operator into a single column. This is necessary so you can easily get to the values for each SampleId . The above version is a static version meaning you are hard-coding the values for the final columns, but if you want to have this adjust based on the PartId , you will need to use dynamic SQL:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @partid int,
    @paramdef nvarchar(max)

set @partid = 1
set @paramdef = '@partid int'

select @cols = STUFF((SELECT ',' + QUOTENAME(sampleid) 
                    from Table2
                    where partid = @partid
                    group by sampleid
                    order by sampleid
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT pname,' + @cols + ' 
            from 
            (
              select t2.sampleid, pname = c.col, c.value
              from table1 t1
              inner join table2 t2
                on t1.partid = t2.partid
                and t1.pid = t2.pid
              cross apply
              (
                select Pname, pvalue union all
                select ''ModifiedDate'', convert(varchar(10), ModifiedDate, 120) union all
                select ''Operator'', Operator
              ) c (col, value)
              where t1.partid = @partid
            ) x
            pivot 
            (
                max(value)
                for sampleid in (' + @cols + ')
            ) p '

exec sp_executesql @query, @paramdef, @partid = @partid;

See SQL Fiddle with Demo . Both give a result:

|        PNAME |          0 |          1 |
|--------------|------------|------------|
|      Breadth |         10 |       Fail |
|       Height |       Fail |       Fail |
|       Length |         10 |         20 |
| ModifiedDate | 2014-03-10 | 2014-03-12 |
|     Operator |       Test |       Test |

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM