sql group by 之后 如何合并分组的文本
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql group by 之后 如何合并分组的文本相关的知识,希望对你有一定的参考价值。
例如:
姓名 内容
1 小名 在家
2 小名 上网
3 小名 睡觉
4 小名 看书
5 小王 上班
6 小王 吃饭
7 小王 打球
8 王强 看电视
9 王强 玩游戏
合并后
姓名 内容
1 小名 在家上网睡觉看书
2 小王 上班吃饭打球
3 王强 看电视玩游戏
谢谢
SELECT 姓名,
MAX(CASE RK WHEN 1 THEN 内容 ELSE '' END)
||MAX(CASE RK WHEN 2 THEN 内容 ELSE '' END)
||MAX(CASE RK WHEN 3 THEN 内容 ELSE '' END)
||MAX(CASE RK WHEN 4 THEN 内容 ELSE '' END)
FROM (SELECT 姓名, 内容,
ROW_NUMBER() OVER(PARTITION BY 姓名 ORDER BY 内容) rk FROM tab) t
GROUP BY 姓名 参考技术A 一,如果是sql2000,只有用自定义函数
create function dbo.f_str(@name int) returns varchar(100)
as
begin
declare @str varchar(1000)
set @str = ''
select @str = @str + cast(内容 as varchar) from 表名 where id = @name set @str = right(@str , len(@str) - 1)
return @str
end
go
--调用函数
select 姓名 , 内容 = dbo.f_str(姓名) from 表名 group by 姓名
drop function dbo.f_str
二,如果是sql2005,那么:
select 姓名, [内容] = stuff((select [内容] from 表名 t where 姓名 = 表名.姓名 for xml path('')) , 1 , 1 , '')
from 表名 group by 姓名 参考技术B 立的视图才能实现你要求的效果
以下为例子:
--(1)建立辅助统计的函数f_un,这里假设订单号字段类型为varchar
create function f_un(@name varchar(255),@color varchar(255))
returns varchar(8000)
as
begin
declare @s varchar(8000)
declare @link varchar(255)
set @s = ''
set @link = ' '--这里是连接单号的字符,按你的要求设置为空格
--组合字符串
select @s = @s +订单号+@link from dingdan_tb where 名称 = @name and 颜色 = @color
--处理多余的@link
set @s = left(@s,len(@s) - len(@link))
--返回结果
return @s
end
--(2)以上是函数,创建上述函数f_un后,用以下语句创建视图
select dbo.f_un(名称,颜色) as 订单号, 名称, 颜色, sum(订单数量) as 订单数量
from dingdan_tb
group by 名称, 颜色 参考技术C select distinct name,(select 内容 as [text()] from test where name=a.name order by id for xml path('')) 内容
from test a 参考技术D --测试通过的代码
Declare
L_join Varchar2(500);
Begin
For RecH In(Select Distinct Name From test)
Loop
For Rec in(Select trim(memo) memo
From test
Where Name = RecH.Name)
Loop
L_join := L_join||Rec.Memo;
End Loop;
dbms_output.put_line(RecH.name||' '||L_join);
L_join := Null;
End Loop;
End;
如何在不使用 GROUP BY 或 PARTITION BY 的情况下对 Oracle SQL 中的数据进行分组
【中文标题】如何在不使用 GROUP BY 或 PARTITION BY 的情况下对 Oracle SQL 中的数据进行分组【英文标题】:How do I group data in Oracle SQL without using GROUP BY OR PARTITION BY 【发布时间】:2021-04-06 22:23:12 【问题描述】:我的数据是这样的
MY_TABLE
DATE | CUSTOMER_ID | FAC_NUM | MONIES |
---|---|---|---|
01/Jan/2020 | 12345678 | ABC123 | 125000 |
02/Jan/2020 | 12345678 | ABC123 | 125000 |
03/Jan/2020 | 12345678 | ABC123 | 125000 |
01/Feb/2020 | 12345678 | ABC123 | 143000 |
02/Feb/2020 | 12345678 | ABC123 | 143000 |
03/Feb/2020 | 12345678 | ABC123 | 143000 |
04/Feb/2020 | 12345678 | ABC123 | 143000 |
05/Feb/2020 | 12345678 | ABC123 | 143000 |
01/Mar/2020 | 12345678 | ABC123 | 125000 |
02/Mar/2020 | 12345678 | ABC123 | 125000 |
03/Mar/2020 | 12345678 | ABC123 | 125000 |
04/Mar/2020 | 12345678 | ABC123 | 125000 |
我希望输出是这样的
CUSTOMER_ID | FAC_NUM | MONIES | START_DATE | END_DATE |
---|---|---|---|---|
12345678 | ABC123 | 125000 | 01/Jan/2020 | 03/JAN/2020 |
12345678 | ABC123 | 143000 | 01/Feb/2020 | 05/Feb/2020 |
12345678 | ABC123 | 125000 | 01/Mar/2020 | 04/Mar/2020 |
我尝试过使用以下
SELECT CUSTOMER_ID
,FAC_NUM
,MONIES
,MIN(DATE) AS START_DATE
,MAX(DATE) AS END_DATE
FROM MY_TABLE
GROUP BY CUSTOMER_ID
,FAC_NUM
,MONIES
但是,我用这种方法得到的输出如下(这不是想要的输出)
CUSTOMER_ID | FAC_NUM | MONIES | START_DATE | END_DATE |
---|---|---|---|---|
12345678 | ABC123 | 125000 | 1 Jan 2020 | 4 Mar 2020 |
12345678 | ABC123 | 143000 | 1 Feb 2020 | 5 Feb 2020 |
有没有办法在不使用 PL/SQL 的情况下获得我正在寻找的输出(我需要在一个巨大的数据集上运行这个查询)?如果不是,那么使用 PL/SQL 执行此操作的最有效方法是什么?
我是 *** 和 SQL 的新手。非常感谢您的支持。
提前感谢您的帮助。
问候, 阿尼
【问题讨论】:
【参考方案1】:如果你描述你想要什么,而不是“我想要输出”,它可能会有所帮助。
在我看来,您似乎还想按月另外分组,例如您的查询稍作修改:
SELECT CUSTOMER_ID
,FAC_NUM
,MONIES
,MIN(DATE) AS START_DATE
,MAX(DATE) AS END_DATE
FROM MY_TABLE
GROUP BY CUSTOMER_ID
,FAC_NUM
,MONIES
, to_char(date, 'yyyymm') --> this
当然,date
列名无效;它是为date
数据类型保留的,所以我认为它实际上命名不同。
【讨论】:
我相信你可以使用DATE
作为列名,如果它每次使用都被引用。
当然,@Bob。但你可以做到这一点并不意味着你应该做到这一点。此外,在 OP 的消息中,没有证据表明他们使用了双引号。【参考方案2】:
这听上去像是一个孤岛问题。岛是具有相同客户、面数和金额的相邻行。每当数量发生变化时,就会开始一个新的组。
这是一种使用行号之间的差异来识别岛屿的方法:
select customer_id, fac_num, monies,
min(date) as start_date, max(date) as end_date
from (
select t.*,
row_number() over(partition by customer_id, fac_num order by date) as rn1,
row_number() over(partition by customer_id, fac_num, monies order by date) as rn2
from mytable t
) t
group by customer_id, fac_num, monies, rn1 - rn2
order by customer_id, fac_num, min(start_date)
【讨论】:
谢谢@GMB。这个解决方案解决了这个问题。 当有两个连续的岛屿具有相同的新货币时,此解决方案不起作用。在这种情况下,它将两个岛视为一个。有没有办法解决这个问题?以上是关于sql group by 之后 如何合并分组的文本的主要内容,如果未能解决你的问题,请参考以下文章
SQL如何先用group by分组,并将分组的结果distinct?
mysql 多表 查询 之后 group by 分组 order by 无法按照日期排序
sql如何取group by 分组的多条记录只取最上面的一条!