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

我在用sqlsever2008,现在有个问题。我的表是这样:商店id时间id用户id购买产品id1122351122561153561157661275781277982... 我在用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分组,最后把相同用户一次购买的产品合并到一条记录里,用逗号隔开。

谢谢大家!
展开
 我来答
西安_白小鹏
2010-08-26 · TA获得超过436个赞
知道小有建树答主
回答量:127
采纳率:0%
帮助的人:91.3万
展开全部
假如你的表结构如下:
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
wangzhiqing999
2010-08-26 · TA获得超过1.6万个赞
知道大有可为答主
回答量:7048
采纳率:100%
帮助的人:3352万
展开全部
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 行受影响)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
CHU102
2010-08-26
知道答主
回答量:7
采纳率:0%
帮助的人:0
展开全部
-商店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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lol_ko
2010-08-26 · 超过32用户采纳过TA的回答
知道答主
回答量:91
采纳率:0%
帮助的人:63.1万
展开全部
--首先建立临时表
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
--然后再从临时表关联更新回原来的表
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
635557275
2010-08-26 · TA获得超过274个赞
知道答主
回答量:125
采纳率:0%
帮助的人:0
展开全部
LZ去 CSDN上注册一个号 去问问吧 那里牛人比较多的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式