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 之后 如何合并分组的文本的主要内容,如果未能解决你的问题,请参考以下文章