我有这两个表:
表A
pj item desc pj_id
------------------------------------
pjA iphone cell phone 1
pjA macbook laptop 2
pjB windows os 3
表B
pj item pj_id version date
-----------------------------------------
pjA iphone 1 2 2010
pjA iphone 1 3 2011
pjA macbook 2 0 2000
pjB windows 3 5 2008
pjB windows 3 6 2014
pjB windows 3 7 2017
我想要
pj item desc detail1 detail2 detail3
---------------------------------------------------------
pjA iphone cell phone 2010(2) 2011(3)
pjA macbook laptop 2000(0)
pjB windows os 2008(5) 2014(6) 2017(7)
您可以看到“详细信息”列是动态的,因为表B中没有项目版本的固定编号
我们知道,SQL Server 2000不支持PIVOT
或FOR XML PATH
。
所以我用Google搜索了一些解决方案,但是它们通常使用存储过程或函数,但是我没有此数据库的权限。
对我来说,最接近的答案可能是this,但我不知道如何在桌子上使用。
任何帮助将不胜感激。
答案 0 :(得分:0)
我有解决办法。您可以使用临时表通过RowNum列创建“详细信息”,然后对Pj_id进行分组。通过使用左连接,您可以重新输入“详细信息”。我仅对3个“详细信息”进行了处理。您可以根据需要扩展。
declare @tableA table(pj varchar(20), item varchar(50), descb varchar(100), pj_id int)
insert into @tableA
select 'pjA', 'iphone', 'cell phone', 1 union all
select 'pjA', 'macbook', 'laptop', 2 union all
select 'pjB', 'windows', 'os', 3
declare @tableB table(pj varchar(20), item varchar(50), pj_id int, version int, vdate int)
insert into @tableB
select 'pjA', 'iphone', 1, 2, 2010 union all
select 'pjA', 'iphone', 1, 3, 2011 union all
select 'pjA', 'macbook', 2, 0, 2000 union all
select 'pjB', 'windows ', 3, 5, 2008 union all
select 'pjB', 'windows', 3, 6, 2014 union all
select 'pjB', 'windows',3, 7, 2017
declare @Details table(pj_id int, Detail varchar(100), RowNum int)----IDENTITY(1,1)
insert into @Details
SELECT pj_id,
Detail=cast(vdate as varchar(20))+'('+cast(SUM(version) as varchar(20))+')',
RowNum = (SELECT COUNT(*) ---Simulating Row_num here
FROM @tableB i
WHERE i.pj_id = o.pj_id
AND cast(i.vdate as varchar(20))<=cast(o.vdate as varchar(20)) )
FROM @tableB o
group by
pj_id, cast(o.vdate as varchar(20))
ORDER BY pj_id, Detail
select
A.*,
detail1=D1.Detail,
detail2=D2.Detail,
detail3=D3.Detail
from
@tableA A
left join @Details D1 ON
D1.pj_id=A.pj_id
AND
D1.RowNum=1
left join @Details D2 ON
D2.pj_id=A.pj_id
AND
D2.RowNum=2
left join @Details D3 ON
D3.pj_id=A.pj_id
AND
D3.RowNum=3
我模拟了ROW_NUMBER。