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

SQL Server 2000中不使用存储过程或函数的动态透视,sql,sql-server,tsql,sql-server-2000,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 ------------------

我有两张桌子:

表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

所以我在谷歌上搜索了一些解决方案,但它们通常使用存储过程或函数,但我没有这个数据库的权限

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


任何帮助都将不胜感激。

我有一个解决方案。您可以使用临时表创建带有RowNum列的“Details”,然后对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

我模拟了行号。

如果您是从应用程序语言(如Java或PHP)调用SQL Server,那么最好在表示层中处理此需求。我认为如果不使用动态SQL,我们无法做到这一点。@TimBiegeleisen是的,这也是一个解决方案,但我不知道如何使用ASP.NET在网格中绑定两个表。从SQL Server 2000升级的时间是几年前的事了。它不受支持,多年来一直不受支持。我希望至少你的前端不是用Pascal或其他古老的语言……@GordonLinoff嗯,有时候你没有选择说“ROW_NUMBER”不是公认的函数名。如何使其在SQL 2000上工作?嗨,Hecxer,请查看修改后的版本。我模拟了行号。第17行列“o.vdate”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。它在此处对我有效,但我已修改。请再试一次。我将pj_id,castvdate作为varchar20更改为->pj_id,casto.vdate作为varchar20。试试SQL Server 2016,它可以工作,但SQL 2000不能