SQL查询多行合并成一行

问题描述:
无论是在sql 2000,还是在 sql 2005 中,都没有提供字符串的聚合函数,
  所以,当我们在处理下列要求时,会比较麻烦:
有表tb, 如下:
id    value
----- ------
1     aa
1     bb
2     aaa
2     bbb
2     ccc
需要得到结果:
id     values
------ -----------
1      aa,bb
2      aaa,bbb,ccc
即, group by id, 求 value 的和(字符串相加)

1. 旧的解决方法

-- 1. 创建处理函数
CREATE FUNCTION dbo.f_str(@id int)
RETURNS varchar(8000)
AS
BEGIN
    DECLARE @r varchar(8000)
    SET @r = ‘‘
    SELECT @r = @r + ‘,‘ + value
    FROM tb
    WHERE [email protected]
    RETURN STUFF(@r, 1, 1, ‘‘)
END
GO
-- 调用函数

SELECt id, values=dbo.f_str(id)
FROM tb
GROUP BY id

-- 2. 新的解决方法
-- 示例数据
DECLARE @t TABLE(id int, value varchar(10))
INSERT @t SELECT 1, ‘aa‘
UNION ALL SELECT 1, ‘bb‘
UNION ALL SELECT 2, ‘aaa‘
UNION ALL SELECT 2, ‘bbb‘
UNION ALL SELECT 2, ‘ccc‘

-- 查询处理
SELECT *
FROM(
    SELECT DISTINCT
        id
    FROM @t
)A
OUTER APPLY(
    SELECT
        [values]= STUFF(REPLACE(REPLACE(
            (
                SELECT value FROM @t N
                WHERE id = A.id
                FOR XML AUTO
            ), ‘<N value="‘, ‘,‘), ‘"/>‘, ‘‘), 1, 1, ‘‘)
)N

/*--结果
id          values
----------- ----------------
1           aa,bb
2           aaa,bbb,ccc
(2 行受影响)
--*/

时间: 2024-10-13 13:51:34

SQL查询多行合并成一行的相关文章

oracle多行合并成一行

在mysql有关键字group_concat提供了类似的功能,在oracle中类似功能关键字是wm_concat.比如我有如下查询数据: 但是我希望能够显示成一行查询出来,结果图如下: 关键sql代码形如: select t.sglcheckid,wm_concat(t.salemodulename) from t_item_group_ex t where t.sglcheckid = '000********004' group by t.sglcheckid mysql 多行合并成一行的解

mysql 和sqlserver的 多行合并成一行

mysql  多行合并: mysql 内置函数 group_concat(exper  SEPARATOR " " ) exper:列明 SEPARATOR " ": 行分隔符 ,这里表示的是使用空格分隔多行 mysql> select * from tmp_02 ; +------------+---------+ | Fclient    | ct      | +------------+---------+ | 安卓       | 1858799 |

logstash收集java日志,多行合并成一行

使用codec的multiline插件实现多行匹配,这是一个可以将多行进行合并的插件,而且可以使用what指定将匹配到的行与前面的行合并还是和后面的行合并. 1.java日志收集测试 input { stdin { codec => multiline { pattern => "^\[" //以"["开头进行正则匹配 negate => true //正则匹配成功 what => "previous" //和前面的内容进

SQL-xml(查询结果,多行合并成一行)

原始数据: select UserName from com_t_userinfo where username like '测试%' 查询结果: 需求所要结果: select UserName+',' from com_t_userinfo where username like '测试%' for xml path ('') 查询结果:

SQL多行合并成一行

with cte as( select groupname,GroupId from Sys_Group where GroupId in( select ReleaseRangeId from Sys_Notice_Permission where ReleaseRangeType=2 and NoticeId=20)) select LEFT(groupname,LEN(groupname)-1) as groupname, LEFT(GroupId,LEN(GroupId)-1) as G

mysql 行变列(多行变成一行/多行合并成一行/多行合并成多列/合并行)

数据库结构如图: 而我想让同一个人的不同成绩变成此人在这一行不同列上显示出来,此时分为2中展现: 第一种展现如图----[多行变一列](合并后的数据在同一列上): sql如下: select name ,group_concat(sore Separator ';') as score from stu group by name 第二种展现如图----[多行变多列](合并后的数据在不同列上): sql如下: SELECT name , MAX(CASE type WHEN '数学' THEN

linux 将多行合并成一行

把a.txt里面的第3-6行内容复制到b.txt里面的第7行 sed -i "7i`sed -n "3,6p" a.txt |xargs`" b.txt

SQL 将一条记录中多个字段的值拼接为一个字段 &amp;&amp; 将多行数据合并成一行,并且拼接CONVERT() 、for xml path的使用

接着上篇文章的订单表(商品编号,价格设置时间id(类似于创建时间,创建时间约早,则act_id越小) ,价格的时间段,商品价格) 一.将一条记录中多个字段的值拼接为一个字段 现要求将两个时间段合并为一个字段,应该如何做呢? 先来看下理想的结果: 查询出的时间段合并到一起了: 代码如下,将查询的字段用+'你想要的符号' + 拼接即可 select item,act_id,loc_id,convert(varchar(100),start_date,20)+ '-' +convert(varchar

mysql中将多行数据合并成一行数据

一个字段可能对应多条数据,用mysql实现将多行数据合并成一行数据 例如:一个活动id(activeId)对应多个模块名(modelName),按照一般的sql语句: 1 SELECT am.activeId,m.modelName 2 FROM activemodel am 3 JOIN model m 4 ON am.modelId = m.modelId 5 ORDER BY am.activeId 查询出的列表为图1所示: 图1 修改过后的sql语句,查询后如图2所示: 1 SELECT