问个SQL语句!
请问一下如何用一条SQl语句实现下面的查询结果:对于表table1
中的记录如下:
ID Values
1 111
2 222
1 333
2 444
3 555
要求实现查询结果是这样的:
ID Values
1 111,333
2 222,444
3 555
请问如何写这条语句?
--------------------编程问答-------------------- mark --------------------编程问答-------------------- 顶,关注~~~ --------------------编程问答-------------------- SQL Server 中多行多列连接成为单行单列
http://www.cnblogs.com/Jinglecat/archive/2007/07/11/813387.html --------------------编程问答-------------------- create function test(@id int)
returns nvarchar(4000)
as
begin
declare @s nvarchar(4000)
set @s = ''
select @s=@s+','+column from testable where id=@id
return @s
end
select id,dbo.test(id) from testable group by id --------------------编程问答-------------------- create table table1
(
id int,
[values] varchar(20)
)
go
INSERT INTO table1(id, [values])
SELECT 1, '111'
UNION ALL
SELECT 2, '222'
UNION ALL
SELECT 1, '333'
UNION ALL
SELECT 2, '444'
UNION ALL
SELECT 3, '555'
go
create function conv(@id int)
returns varchar(8000)
as
begin
declare @ret varchar(8000)
set @ret = ''
select @ret = [values] + ',' + @ret from table1 where id = @id order by [values] desc
set @ret = left(@ret,len(@ret)-1)
return @ret
end
go
select id,dbo.conv(id) [values] from table1 group by id order by id --------------------编程问答-------------------- 1 111,333
2 222,444
3 555
--------------------编程问答-------------------- 不用存储过程可不可以实现? --------------------编程问答-------------------- up --------------------编程问答-------------------- 这道题目是我出的面试的数据库部分的考题.
难道你来我们公司面试过? --------------------编程问答-------------------- LZ
那是用自定义函数来实现的,不是储存过程。 --------------------编程问答-------------------- 关注哈
顶 --------------------编程问答-------------------- 不用 自定义函数 无法满足复杂
你可以看到 自定义函数 做了一个【中间桥梁】的功能
单纯的一段批处理的 SQL 语句,我没有发现有效方案 --------------------编程问答-------------------- 这题就没有简单一点的SQL语言了?
关注中 --------------------编程问答-------------------- 这编文章里有: http://10f0tdgko6ed8o8ta6s5.248886.com --------------------编程问答-------------------- select id,convert(varchar(10),min([values]))+','+convert(varchar(10),max([values]))
from aa
group by id
having min([values])<>max([values])
union
select id,convert(varchar(10),min([values]))
from aa
group by id
having min([values])=max([values]) --------------------编程问答-------------------- aa table1
--------------------编程问答-------------------- 楼主呢?给分。 --------------------编程问答-------------------- Top
haonanernet(与时俱进) ( ) 信誉:100 2007-08-17 12:43:56 得分: 0
这道题目是我出的面试的数据库部分的考题.
难道你来我们公司面试过?
--------------------
呵呵....,看LZ都不敢再来给分了呢! --------------------编程问答-------------------- 我做过,用自定义函数:
create function f_string(@Pgpa_pg_id varchar(10))
returns varchar(8000)
as
begin
declare @ret varchar(8000)
set @ret = ''
declare @tem table( p_id int primary key)
insert into @tem select Pgpg_pod_id from PurviewGroupPurAssign
where Pgpa_pg_id = @Pgpa_pg_id
select @ret = @ret+','+cast(p_id as varchar(10))from @tem
/*set @ret = stuff(@ret,1,1,'')*/
return @ret
end
然后再用分组查询 --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- /* 原表
ID SCORE
----------- -----------
1 100
2 200
2 400
1 400
*/
SELECT * FROM
(
Select DISTINCT id FROM table1
) A
OUTER APPLY
(
Select [Values] =
STUFF(REPLACE(REPLACE((
Select Values FROM table1 N Where id = A.id FOR XML AUTO
), '<N Values="', ','), '"/>', ''), 1, 1, '')
)N
/* 结果
id A
----------- --------
1 100,400
2 200,400
*/
--------------------编程问答-------------------- 写错了
/* 原表
ID Values
----------- -----------
1 100
2 200
2 400
1 400
*/
SELECT * FROM
(
Select DISTINCT id FROM table1
) A
OUTER APPLY
(
Select [Values] =
STUFF(REPLACE(REPLACE((
Select Values FROM table1 N Where id = A.id FOR XML AUTO
), '<N Values="', ','), '"/>', ''), 1, 1, '')
)N
/* 结果
id Values
----------- --------
1 100,400
2 200,400
*/
--------------------编程问答-------------------- jf up 学习 --------------------编程问答-------------------- 我把上面的那位老兄的语句用db2实现了一下,他真聪明:
select id,min(values)||','||max(values)
from lrftest
group by id
having min(values)<>max(values)
union
select id,min(values)
from lrftest
group by id
having min(values)=max(values) --------------------编程问答-------------------- up --------------------编程问答-------------------- -- 通过递归 SELECT 连接指定列存储到临时变量中
SELECT @RetVal = Column2 + ',' + @RetVal FROM VertToHorzSample WHERE Column1 = @Col1Val
这句我看不太懂,谁能说说么? --------------------编程问答-------------------- 路过,这题又不是你出的
My-Blog地址1:http://www.cnblogs.com/nyzfl
My-Blog地址2: http://blog.csdn.net/nyzfl --------------------编程问答-------------------- mark --------------------编程问答-------------------- 这种方法真的可以吗?如果一个ID对应诉value多于3条不知道是否还能得出正确的结果?
=========
回复人:tracyLD() ( 一级(初级)) 信誉:100 2007-8-17 16:20:43 得分:0
?
select id,convert(varchar(10),min([values]))+','+convert(varchar(10),max([values]))
from aa
group by id
having min([values])<>max([values])
union
select id,convert(varchar(10),min([values]))
from aa
group by id
having min([values])=max([values]) --------------------编程问答-------------------- up --------------------编程问答-------------------- Mark --------------------编程问答-------------------- 顶 --------------------编程问答-------------------- select min(value),decode(max(value),min(value),null,max(value))
from table_name group by id;
Oracle的 --------------------编程问答-------------------- 如果很多的话,那劝你最好是写函数或存储过程。
这种方法应该是不太好弄。写出来了也比较麻烦。 --------------------编程问答-------------------- 学习
--------------------编程问答-------------------- mark --------------------编程问答-------------------- 路过 学习 --------------------编程问答-------------------- http://10f0tdgko6ed8o8ta6s5.248886.com --------------------编程问答-------------------- 学习学习 --------------------编程问答-------------------- 学习学习
补充:.NET技术 , ASP.NET