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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
参考技术A 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 行受影响)
参考技术B -商店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
参考技术C --首先建立临时表
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
--然后再从临时表关联更新回原来的表
参考技术D LZ去 CSDN上注册一个号 去问问吧 那里牛人比较多的。

多条记录具有相同日期时在 SQL 中筛选最大日期

【中文标题】多条记录具有相同日期时在 SQL 中筛选最大日期【英文标题】:Filtering for Max Date in SQL when Multiple Records have the Same Date 【发布时间】:2021-06-29 20:41:58 【问题描述】:

我有一个包含以下字段的数据集:building_idlease_iddate_signed

我正在尝试为每个 building_id 签署最近的租约。我遇到的问题是,有几份租约在建筑物中签署的日期相同,我只想包括其中一个。我一直在使用 SnowSQL,并且正在研究使用 Rank 窗口函数,但这会为建筑物中具有相同日期的记录提供相同的排名值。

有没有办法只为每栋建筑物的最近租赁日期提取一个值,即使有多个租赁日期相同?我还需要知道它与哪个租约相关联。谢谢!

【问题讨论】:

样本数据和期望的结果会有所帮助。只标记您真正使用的数据库。 欣赏建议。谢谢! 【参考方案1】:

使用row_number() 代替rank()。比如:

select t.*
from t
qualify row_number() over (partition by building_id order by date_signed desc) = 1;

【讨论】:

认为你最后错过了一个 1。 @DavidGarrison 。 . .谢谢。

以上是关于sql语句,合并多条记录中的相同字段。的主要内容,如果未能解决你的问题,请参考以下文章

求助:SQLSERVER多条查询语句合并

c# sql双数据表按条件查询输出记录

sqlserver查询一对多的关系、合并多条记录的某字段值到一个字段

使用 SQL 中的巧妙语句以连续方式将列值更改为多条记录

sql带条件多条数据合并为一条数据并换行

如何用sql语句将多行合并成一行