现在有一张数据表:Table1
FcaID FSec FName
001 1 卡片1
001 2 卡片2
002 1 卡片3
002 2 卡片4
002 3 卡片5
说明:同一个FcaID可能对应着N条记录(1=<N<=10)
如果不通过写存储过程或函数,只用sql,能否实现以下取数:
FcaID FName
001 卡片1卡片2
002 卡片3卡片4卡片5
SqlServer2000,多谢~~~~~~
------解决方案--------------------
select FcaID,
max(case when FSec=1 then FName else '' end)+
max(case when FSec=2 then FName else '' end)+
max(case when FSec=3 then FName else '' end)+
...............
max(case when FSec=9 then FName else '' end)+
max(case when FSec=10 then FName else '' end)
from Table1 group by FcaID
------解决方案--------------------
2000的静态行列转换应该可以实现
------解决方案--------------------
create table table1(FcaID varchar(10), FSec int, FName varchar(20))
insert into table1
select '001', 1 ,'卡片1' union all
select '001', 2 ,'卡片2' union all
select '002', 1 ,'卡片3' union all
select '002', 2 ,'卡片4' union all
select '002', 3 ,'卡片5'
go
select FcaID,left(FName,LEN(fname)-1) as fname
from
(
select FcaID,
MAX(case when FSec=1 then FName+',' else '' end) +
MAX(case when FSec=2 then FName+',' else '' end) +
MAX(case when FSec=3 then FName+',' else '' end) +
MAX(case when FSec=4 then FName+',' else '' end) +
MAX(case when FSec=5 then FName+',' else '' end) +
MAX(case when FSec=6 then FName+',' else '' end) +
MAX(case when FSec=7 then FName+',' else '' end) +
MAX(case when FSec=8 then FName+',' else '' end) +
MAX(case when FSec=9 then FName+',' else '' end) +
MAX(case when FSec=10 then FName+',' else '' end) as fname
from table1
group by FcaID
)t
/*
FcaID fname
001 卡片1,卡片2
002 卡片3,卡片4,卡片5
*/
------解决方案--------------------
有表tb, 如下:
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
需要得到结果:
id values
------ -----------
1 aa,bb
2 aaa,bbb,ccc
即, group by id, 求 value 的和(字符串相加)
1. 旧的解决方法
-- 1. 创建处理函数
CREATE FUNCTION dbo.f_str(@id int)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + ',' + value
FROM tb
WHERE id=@id