不使用存储过程或函数的SQL Server 2000中的动态数据透视

时间:2018-07-19 01:56:44

标签: sql sql-server tsql sql-server-2000

我有这两个表:

表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不支持PIVOTFOR XML PATH

所以我用Google搜索了一些解决方案,但是它们通常使用存储过程或函数,但是我没有此数据库的权限。

对我来说,最接近的答案可能是this,但我不知道如何在桌子上使用。

任何帮助将不胜感激。

1 个答案:

答案 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。