Jol*_*guy -2 sql pivot sql-server-2008
首先,我是SQL新手.下面是示例(对于table1和table2,我创建了一个SNO作为主键,这也是标识列)
表1:
PID PNAME PartID
--- ----- ------
0 Length 1
1 Breadth 1
2 Height 1
0 Area 2
1 Volume 2
Run Code Online (Sandbox Code Playgroud)
表2:
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
Run Code Online (Sandbox Code Playgroud)
根据PartID,我必须得到以下结果
PARTID:1
PNAME 0 1
------------ --------- ---------
Length 10 20
Breadth 10 Fail
Height Fail Fail
ModifiedDate 10-Mar-14 12-Mar-14
Operator Test Test
Run Code Online (Sandbox Code Playgroud)
PARTID:2
PNAME 0
------------ ---------
Area 10
Volume 10
ModifiedDate 13-Mar-14
Operator Test1
Run Code Online (Sandbox Code Playgroud)
如何在SQL Server 2008中实现上述所需的输出?
您可以使用PIVOT来获取结果,但是您还需要取消ModifiedDate和Operator列的展开,这样您就可以在一列中显示它们PName.您的最终结果将需要一个动态解决方案,但首先编写此静态然后转换为动态sql会容易得多.
基本语法是:
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;
Run Code Online (Sandbox Code Playgroud)
请参阅SQL Fiddle with Demo.你会看到,我用CROSS APPLY的3列转换PName,ModifiedDate并Operator成一列.这是必要的,因此您可以轻松获得每个值SampleId.上面的版本是一个静态版本,这意味着您要对最终列的值进行硬编码,但如果您希望根据该值进行调整PartId,则需要使用动态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;
Run Code Online (Sandbox Code Playgroud)
请参阅SQL Fiddle with Demo.两者都给出了结果:
| PNAME | 0 | 1 |
|--------------|------------|------------|
| Breadth | 10 | Fail |
| Height | Fail | Fail |
| Length | 10 | 20 |
| ModifiedDate | 2014-03-10 | 2014-03-12 |
| Operator | Test | Test |
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
63 次 |
| 最近记录: |