当前位置: 代码迷 >> Sql Server >> SQL语句思路
  详细解决方案

SQL语句思路

热度:26   发布时间:2016-04-24 20:18:18.0
求助SQL语句思路
有两张表,一张是产品表,一张是产品对应的供应商表。
一个产品对应的供应商不确定。

产品表字段            
EDPNO             
 A                  
 B                  
 C 
 
 供应商表字段               
EDPNO             VENDOR
  A              JAPAN
  A              SUZHOU
  A              HANGZHOU
  B              HANGZHOU
  B              SUZHOU
  C              JAPAN

请教各位大虾可以实现这样的结果吗(如果供应商数量超过3个,继续在后面追加)
EDPNO    VENDOR1     VENDOR2    VENDOR3  
 A        JAPAN      SUZHOU     HANGZHOU 
 B        HANGZHOU   SUZHOU
 C        JAPAN
                     

------解决方案--------------------

;with cte(EDPNO,VENDOR) as
(
select 'A','JAPAN'
union all select 'A','SUZHOU'
union all select 'A','HANGZHOU'
union all select 'B','HANGZHOU'
union all select 'B','SUZHOU'
union all select 'C','JAPAN'
)

select a.EDPNO,
stuff((select ', '+VENDOR from cte b 
       where b.EDPNO=a.EDPNO 
       for xml path('')),1,1,'') 'VENDOR'
from cte a
group by  a.EDPNO

/*
EDPNO VENDOR
--------------------------------
A  JAPAN, SUZHOU, HANGZHOU
B  HANGZHOU, SUZHOU
C  JAPAN
*/


这个结果能够接受吗
------解决方案--------------------


if object_id('cte') is not null
drop table cte
go
create table cte
(
EDPNO nvarchar(10),
VENDOR nvarchar(20)
) 
go
insert into cte
select 'A','JAPAN'
union all select 'A','SUZHOU'
union all select 'A','HANGZHOU'
union all select 'B','HANGZHOU'
union all select 'B','SUZHOU'
union all select 'C','JAPAN'
go
select * from cte
go
--动态写法
DECLARE @s NVARCHAR(4000)
SET @s = ''
SELECT  @s = @s + ',[VENDOR]'++'=max(case when [VENDOR]='
        + QUOTENAME([VENDOR], '''') + ' then [VENDOR] end)'
FROM    cte
group by [VENDOR]
print @s
EXEC('select EDPNO'+@s+' from cte group by EDPNO')
go
--静态写法
select EDPNO 
--,row_number()over(order by EDPNO)as id
,[VENDOR1]=max(case when [VENDOR]='HANGZHOU' then [VENDOR]  end)
,[VENDOR2]=max(case when [VENDOR]='JAPAN' then [VENDOR] end)
,[VENDOR3]=max(case when [VENDOR]='SUZHOU' then [VENDOR] end)
from cte group by EDPNO

go
--值放在一列
select a.EDPNO,
stuff((select ', '+VENDOR from cte b 
       where b.EDPNO=a.EDPNO 
       for xml path('')),1,1,'') 'VENDOR'
from cte a
group by  a.EDPNO


  相关解决方案