T-SQL行合并成列与列拆分成行

本文出处:http://www.cnblogs.com/wy123/p/6910468.html

  感觉最近sql也没少写,突然有一点生疏了,对于用的不是太频繁的一些操作,时间一久就容易生。

多行的某一个列合并成一个列

CREATE TABLE TestColumnMergeAndSplit
(
    Id int Identity(1,1),
    BusinessId int,
    BusinessValue varchar(20)
)
GO

INSERT INTO TestColumnMergeAndSplit
SELECT 1,‘AAA‘
UNION ALL
SELECT 1,‘BBB‘
UNION ALL
SELECT 1,‘CCC‘
UNION ALL
SELECT 2,‘XXX‘
UNION ALL
SELECT 2,‘YYY‘
UNION ALL
SELECT 2,‘ZZZ‘
GO

SELECT * FROM TestColumnMergeAndSplit
GO

SELECT  t1.BusinessId,
       STUFF
       (
            ( SELECT     ‘,‘+t2.BusinessValue
              FROM      TestColumnMergeAndSplit t2
              WHERE     t2.BusinessId = t1.BusinessId
            FOR
              XML PATH(‘‘)
            ),
            1,1,‘‘
        )
         AS ColNames
FROM   TestColumnMergeAndSplit t1
GROUP BY t1.BusinessId
GO

  另外是一个相反的操作,借助上面合并之后的结果,将一个多个值的字符串列拆分开来,转换为多行,

  

  用到的字符串拆分函数,比较常见

CREATE FUNCTION [dbo].[fn_SplitStringToTable]
(
    @s     VARCHAR(max),
    @split VARCHAR(10)
)
RETURNS @re TABLE
        (
            Id INT IDENTITY(1,1),
            Value VARCHAR(100)
        )
AS
BEGIN

    IF @s IS NULL
        RETURN

    IF @split IS NULL
        RETURN

    IF(LEN(@split)<=0)
    BEGIN
        INSERT INTO @re VALUES (@s)
        RETURN
    END

    DECLARE @splitlen INT

    SET @splitlen=LEN(@split ) - 1
    WHILE CHARINDEX(@split, @s) > 0
    BEGIN
        INSERT @re VALUES(LEFT(@s, CHARINDEX(@split, @s) - 1))
        SET @s=STUFF(@s, 1, CHARINDEX(@split, @s) + @splitlen, ‘‘)
    END
    INSERT @re VALUES(@s)
    RETURN
END

测试脚本,没啥技术含量

CREATE TABLE TestColumnMergeAndSplit
(
    Id int Identity(1,1),
    BusinessId int,
    BusinessValue varchar(20)
)
GO

INSERT INTO TestColumnMergeAndSplit
SELECT 1,‘AAA‘
UNION ALL
SELECT 1,‘BBB‘
UNION ALL
SELECT 1,‘CCC‘
UNION ALL
SELECT 2,‘XXX‘
UNION ALL
SELECT 2,‘YYY‘
UNION ALL
SELECT 2,‘ZZZ‘
GO

SELECT * FROM TestColumnMergeAndSplit
GO
--合并多列为一列
SELECT  t1.BusinessId,
       STUFF
       (
            ( SELECT     ‘,‘+t2.BusinessValue
              FROM      TestColumnMergeAndSplit t2
              WHERE     t2.BusinessId = t1.BusinessId
              FOR XML PATH(‘‘)
            ),
            1,1,‘‘
        )
         AS ColString
FROM   TestColumnMergeAndSplit t1
GROUP BY t1.BusinessId
GO

SELECT * FROM TestColumnMergeAndSplit_BAK
GO

SELECT t1.BusinessId,t1.ColString,t2.Id,t2.Value
FROM TestColumnMergeAndSplit_BAK t1
    CROSS APPLY dbo.fn_SplitStringToTable(ColString,‘,‘)t2
GO

  

时间: 2024-12-27 23:55:27

T-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" //和前面的内容进

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

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

SQL查询多行合并成一行

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

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

linux 将多行合并成一行

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

SQL行合并

1 CREATE TABLE SC 2 3 ( 4 5 Student NVARCHAR(50), 6 7 Course NVARCHAR(50) 8 9 ) 10 11 INSERT INTO SC 12 13 SELECT N'张三',N'大学语文' UNION ALL 14 15 SELECT N'李四',N'大学语文' UNION ALL 16 17 SELECT N'张三',N'书法鉴赏' UNION ALL 18 19 SELECT N'张三',N'音乐赏析' UNION ALL 2

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

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