sql group by 之后 如何合并分组的文本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql group by 之后 如何合并分组的文本相关的知识,希望对你有一定的参考价值。

例如:
姓名 内容
1 小名 在家
2 小名 上网
3 小名 睡觉
4 小名 看书
5 小王 上班
6 小王 吃饭
7 小王 打球
8 王强 看电视
9 王强 玩游戏
合并后
姓名 内容
1 小名 在家上网睡觉看书
2 小王 上班吃饭打球
3 王强 看电视玩游戏

谢谢

db2 / oracle /sql server 2005以上,可以这样做
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 之后 如何合并分组的文本的主要内容,如果未能解决你的问题,请参考以下文章

如何使用group by 分组查询表中所有字段信息

SQL如何先用group by分组,并将分组的结果distinct?

mysql 多表 查询 之后 group by 分组 order by 无法按照日期排序

sql如何取group by 分组的多条记录只取最上面的一条!

MYsql5.7版本之后,用group by查询不在分组字段遇到的坑

EF Linq to Sql 多表left join查询并对结果group by分组之后进行count,max等处理