sql语句,合并多条记录中的相同字段。

我在用sql sever2008,现在有个问题。我的表是这样:
商店id 时间id 用户id 购买产品id
1 1 2 235
1 1 2 256
1 1 5 356
1 1 5 766
1 2 7 578
1 2 7 798
2 2 5 433
2 2 5 298
2 2 5 478
现在想变成:
商店id 时间id 用户id 购买产品id
1 1 2 235,256
1 1 5 356,766
1 2 7 578,798
2 2 5 433,298,478
也就是说首先按照商店id分组,再按时间分组,再按照用户id分组,最后把相同用户一次购买的产品合并到一条记录里,用逗号隔开。

谢谢大家!

假如你的表结构如下:
create table tb_test
(
商店id int,
时间id int,
用户id int,
购买产品id int
)

可以创建如下聚合函数:
create function fn_test(@商店id int,@时间id int,@用户id int)
returns varchar(8000)
as
begin
declare @ret varchar(8000)
set @ret=''
select @ret=@ret+convert(varchar(100),购买产品id int)+',' from tb_test where 商店id=@商店id and 时间id=@时间id and 用户id=@用户id
select @ret=left(@ret,len(@ret)-1)
return(@ret)
end

然后用如下SQL语句进行查询即可。
(@商店id int,@时间id int,@用户id int
select 商店id,时间id,用户id,dbo.fn_test(商店id,时间id,用户id)as 购买产品id
from tb_test
group by 商店id,时间id,用户id

还有一种更简单的办法,在2005上测试没有问题,2008上可自己验证一下:
select
商店id,时间id,用户id,
stuff((select ','+convert(varchar(10),购买产品id) from tb_test b
where 商店id=a.商店id and 时间id=a.时间id and 用户id=a.用户id
for xml path('')),1,1,'')
from tb_test a
group by 商店id,时间id,用户id
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-08-26
7> CREATE TABLE TestWZY (
8> [商店id] INT,
9> [时间id] INT,
10> [用户id] INT,
11> [购买产品id] INT
12> );
13> go
1> INSERT INTO TestWZY VALUES (1, 1, 2, 235);
2> INSERT INTO TestWZY VALUES (1, 1, 2, 256);
3> INSERT INTO TestWZY VALUES (1, 1, 5, 356);
4> INSERT INTO TestWZY VALUES (1, 1, 5, 766);
5> INSERT INTO TestWZY VALUES (1, 2, 7, 578);
6> INSERT INTO TestWZY VALUES (1, 2, 7, 798);
7> INSERT INTO TestWZY VALUES (2, 2, 5, 433);
8> INSERT INTO TestWZY VALUES (2, 2, 5, 298);
9> INSERT INTO TestWZY VALUES (2, 2, 5, 478);
10> go

(1 行受影响)

1>
2> SELECT
3> [商店id],
4> [时间id],
5> [用户id],
6> LEFT([购买产品id列表], LEN([购买产品id列表]) - 1) AS [购买产品id列表]
7> FROM
8> (
9> SELECT
10> [商店id],
11> [时间id],
12> [用户id],
13> MAX( CASE WHEN SubQuery.Row = 1 THEN LTRIM(STR([购买产品id])) + ',' ELSE
'' END )
14> + MAX( CASE WHEN SubQuery.Row = 2 THEN LTRIM(STR([购买产品id])) + ',' EL
SE '' END )
15> + MAX( CASE WHEN SubQuery.Row = 3 THEN LTRIM(STR([购买产品id])) + ',' EL
SE '' END )
16> + MAX( CASE WHEN SubQuery.Row = 4 THEN LTRIM(STR([购买产品id])) + ',' EL
SE '' END )
17> + MAX( CASE WHEN SubQuery.Row = 5 THEN LTRIM(STR([购买产品id])) + ',' EL
SE '' END ) AS [购买产品id列表]
18> FROM
19> (
20> SELECT
21> ROW_NUMBER() OVER (PARTITION BY [商店id],[时间id],[用户id] ORDER BY
[商店id],[时间id],[用户id]) AS Row,
22> [商店id],
23> [时间id],
24> [用户id],
25> [购买产品id]
26> FROM
27> TestWZY
28> ) SubQuery
29> GROUP BY
30> [商店id],
31> [时间id],
32> [用户id]
33> ) TmpQuery
34> go
商店id 时间id 用户id 购买产品id列表

----------- ----------- ----------- --------------------------------------------
-----------
1 1 2 235,256

1 1 5 356,766

1 2 7 578,798

2 2 5 433,298,478

(4 行受影响)
第2个回答  2010-08-26
-商店id 时间id 用户id 购买产品id
-1 1 2 235
=1 1 2 256
+1 1 5 356
-1 1 5 766
+1 2 7 578
+1 2 7 798
-2 2 5 433
-2 2 5 298
=2 2 5 478

商店id 时间id 用户id 购买产品id
1 1 2 235,256
1 1 5 356,766
1 2 7 578,798
2 2 5 433,298,478
第3个回答  2010-08-26
--首先建立临时表
select a.商店id,a.时间id,a.用户id,sum(a.购买产品id+b.购买产品id) as 购买产品id
into tab_3 from tab_1 a,tab_2 b
where a.商店id=b.商店id,a.时间id=b.时间id,a.用户id=b.用户id
group by a.商店id,a.时间id,a.用户id
order by a.商店id,a.时间id,a.用户id
--然后再从临时表关联更新回原来的表
第4个回答  2010-08-26
LZ去 CSDN上注册一个号 去问问吧 那里牛人比较多的。

sql语句,合并多条记录中的相同字段。
create table tb_test (商店id int,时间id int,用户id int,购买产品id int )可以创建如下聚合函数:create function fn_test(@商店id int,@时间id int,@用户id int)returns varchar(8000)as begin declare @ret varchar(8000)set @ret=''select @ret=@ret+convert(varchar(100),购买产品id int...

SQL中如何合并多个数据表中的字段(列)
在SQL中,合并多个数据表的字段通常涉及两个主要过程:横向扩展与列方向的扩展。横向扩展通过JOIN操作实现,它将两个数据表按照特定关联条件结合,扩展每条记录的字段,对每行的字段进行合并。与此相对应,列方向的扩展则可以通过SQL的UNION或UNION ALL函数完成。UNION 默认形式为UNION DISTINCT,即在合并两...

sql如何把多条重复记录合并?
sql="select * from [table] where [name]='admin'"set rs=conn.execute(sql)do while not rs.eof newvalue=newvalue&","&rs("value")rs.movenext loop set rs=nothing newvalue=mid(newvalue,2,len(txt)-1)conn.execute("delete from [table] where [name]='admin'")conn.execute("i...

怎么用sql语句,匹配多行数据的同一个字段
select mainId from mainTable where mainId in (select mainId from relationTable, tagTable where relationTable.tagId = tagTable.tagId )如果要特定的某个(某些)tagId,就增加条件 select mainId from mainTable where mainId in (select mainId from relationTab...

SQL 如何将一个表中的两条或多条拥有相同ID的记录合并为一条?
cid int,id varchar(500))二、添加数据:insert into stuUnion elect 1,'a' union select 1,'b' union select 2,'c' union select 2,'d' union select 3,'e' union select 3,'f' union select 3,'g'三、用标量函数查询:创建标量函数:create function b(@cid int)returns varchar(500...

如何用SQL语句查询两张表中的相同字段数据
查询两张表中的数据可以采取连接和联合的方法来合并、组合来自不同表里的数据 ,其中连接又可以有内连接、外连接和自然连接等多种形式,连接条件可以根据需要任易设置,亦可以对等连接也可以非对等连接,还可以组合使用逻辑运算符设置连接条件。具体的SQL语句必须捉供表结构和输出要求才能给出,语句形式的...

sqlserver查询一对多的关系、合并多条记录的某字段值到一个字段
现有如下两个表格construct和attachment,通过construct.id = attachment.link_id进行关联。现需要从attachment表提取每一个construct对应的多个file_path值,并与construct合并。通过stuff()、 for xml path() 进行拼接,直接上sql语句:查询结果为:

怎样Oracle把多条记录的相同字段拼成一个字符串
select name,row_number()over(order by 字段) id from 查询结果 )connect by prior id = id-1 ))where id=1;测试log:[TEST@ORA1] SQL>select * from test2;NAM ID --- --- aaa 234 bbb 786 ccc 879 [TEST@ORA1] SQL>select name from(2 select row_number()...

SQL中如何合并多条记录的某一个字段?
这个可以写一个函数:create function f1(@id AS int)returns varchar(100)asdeclare @a as varchar(100)set @a=''select @a=@a+','+备注 from 表2 where cid=@idreturn substring(@a,2,len(@a))然后这样写查询:select 企业名称,联系人,f1(id) from 表 ...

SQL 多个表中查询某个相同字段值
需要3条查询语句,条件where code = 123,然后在查到的3跳记录中显示的时候分别加上对应的想要添加的信息就可以了,一次查出来是不可能的,而且数据库如果这么智能就没人敢用了~

相似回答