高手请帮我写下这条高难度SQL语句???
有一张表table,如下
col1 col2
101 aaa
101 bbb
101 ccc
102 ddd
102 eee
我想用一条SQL语句得到如下的结果(不要用函数和存储过程,因为表太大,用以后太慢),
101 aaabbbccc
102 dddeee
请问用一条SQL语句如何实现???
[解决办法]
不用函数估计挺困难,期待高人
[解决办法]
declare @a table (col1 int,col2 varchar(30))
insert @a
select '101 ', 'aaa '
union all
select '101 ', 'bbb '
union all
select '101 ', 'ccc '
union all
select '102 ', 'ddd '
union all
select '102 ', 'eee '
select * from (select distinct col1 from @a) A
outer apply( select col2=stuff(replace(replace(
(select col2 from @a X where col1=A.col1 for XML AUTO), ' <X col2= " ', ' '), ' "/> ', ' ')
,1,1, ' '))X
(5 行受影响)
col1 col2
----------- ----------------------------------------------------------------------------------------------------------------
101 aabbbccc
102 ddeee
(2 行受影响)
[解决办法]
,1,1, ' '))X 改为,1,0, ' '))X
[解决办法]
(5 行受影响)
col1 col2
----------- -----------
101 aaabbbccc
102 dddeee
(2 行受影响)
[解决办法]
楼上的是SQL2005吧?
[解决办法]
嗯
[解决办法]
--临时表法
create table T(col1 int, col2 varchar(10))
insert T select 101, 'aaa '
union all select 101, 'bbb '
union all select 101, 'ccc '
union all select 102, 'ddd '
union all select 102, 'eee '
select col1, col2=cast(col2 as varchar(1000))
into #T
from T
order by col1
declare @col1 int, @col2 varchar(1000)
update #T set
@col2=case when col1=@col1 then @col2+col2 else col2 end,
@col1=col1,
col2=@col2
select col1, col2=max(col2) from #T
group by col1
--result
col1 col2
----------- ---------
101 aaabbbccc
102 dddeee
(2 row(s) affected)
[解决办法]
create table T(col1 int, col2 varchar(10))
insert T select 101, 'aaa '
union all select 101, 'bbb '
union all select 101, 'ccc '
union all select 102, 'ddd '
union all select 102, 'eee '
--创建一个合并的函数
create function f_hb(@a int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ' '
select @str = @str + ', ' + cast(col2 as varchar) from T where col1 = @a
set @str = right(@str , len(@str) - 1)
return(@str)
End
go
--调用自定义函数得到结果:
select distinct col1 ,dbo.f_hb(col1) as b from T
drop table T
--结果
col1 col2
----------- ---------
101 aaabbbccc
102 dddeee
(2 row(s) affected)
[解决办法]
使用update可以对变量赋值,同意marco08(天道酬勤)的方案
不过在创建临时表的时候系统锁定sysobjects表,会降低系统的并发度
如果数据量不太大而且服务器硬件资源配置高的话可以使用table变量来代替临时表#T
[解决办法]
我以前也问过同样的问题,得到的结果是不行
一条SQL是写不出来的,一般的解决办法是存储过程或者拆成两条SQL语句,我上次=了好久,都没有解决,最后还是拆成了两句SQL,如果问题解决了,劳烦告诉我一声
[解决办法]
用一条查询语句好像不行吧,
哈哈,反正我是不会
[解决办法]
marco08(天道酬勤) 改成这样可能会更好:
create table T(col1 int, col2 varchar(10))
insert T select 101, 'aaa '
union all select 101, 'bbb '
union all select 101, 'ccc '
union all select 102, 'ddd '
union all select 102, 'eee '
go
declare @tempTab table(col1 int,col2 varchar(1000))
insert into @tempTab
select col1, col2=cast(col2 as varchar(1000))
from T
order by col1
declare @col1 int, @col2 varchar(1000)
update @tempTab set
@col2=case when col1=@col1 then @col2+col2 else col2 end,
@col1=col1,
col2=@col2
select col1, col2=max(col2) from @tempTab
group by col1
[解决办法]
create table aa
(
SN smallint,
Groups varchar(20)
)
insert into aa
select 109, '甲組 ' union all
select 110, '甲組 ' union all
select 110, '乙組 ' union all
select 110, '丙組 ' union all
select 331, '甲組 ' union all
select 331, '丙組 ' union all
select 332, '丙組 ' union all
select 332, '丁組 ' union all
select 332, '戊組 ' union all
select 333, '甲組 ' union all
select 333, '乙組 ' union all
select 333, '戊組 '
declare ee cursor for select * from aa
declare @sn smallint,@sn1 smallint,@groups varchar(50),@groups1 varchar(50)
drop table #aa
create table #aa
(
sn smallint,
groups varchar(20)
)
open ee
fetch from ee into @sn,@groups
set @sn1=@sn --@sn1變量是用來和@sn比較是否相等
set @groups1= ' '--如果@sn1和@sn相等,那麼@group1用來連接多個字符串
while (@@fetch_status=0)
begin
if (@sn=@sn1)
begin
set @groups1=@groups1+@groups
end
else --不等的話,就把上幾條相等的sn及對應的字符串之和放入#aa 中
--並且重新給@sn1,@group1賦值,表示下一條不同記錄開始
begin
insert into #aa (sn,groups) values (@sn1,@groups1)
set @sn1=@sn
set @groups1=@groups
end
fetch from ee into @sn,@groups
end
insert into #aa (sn,groups) values (@sn1,@groups1) --插入aa表中最後一條sn相同及對應的字符串之和
select * from #aa
close ee
deallocate ee
sn groups
-------------
109甲組
110甲組乙組丙組
331甲組丙組
332丙組丁組戊組
333甲組乙組戊組
[解决办法]
老大~~你别搞啦~~都这样用吧!
create table T(col1 int, col2 varchar(10))
insert T select 101, 'aaa '
union all select 101, 'bbb '
union all select 101, 'ccc '
union all select 102, 'ddd '
union all select 102, 'eee '
go
create Function fcol(@col1 int)
returns varchar(100)
as
begin
declare @ret varchar(100)
set @ret = ' '
select @ret=@ret+col2 from t where col1=@col1
return @ret
end
go
select col1,dbo.fcol(col1) from t group by col1