合并同一行内不同列的相同数据
2009-09-11 14:05
651 查看
有一个表
a b c a b b null null
d b c y null c a a
y r v a null c null null
合并同一行里的重复数据,合并完后的数据为
a b c null null
d b c y a
y r v a c
去除重复数据,但是首次出现的顺序不变
----------------------------------
/*---------------------------------
-- Author : htl258(Tony)
-- Date : 2009-09-11 10:36:58
-- Version: Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
Mar 29 2009 10:27:29
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
---------------------------------*/
--> 生成测试数据表:tb
IF NOT OBJECT_ID('[tb]') IS NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb]([Col1] nvarchar(1),[Col2] nvarchar(1),[Col3] nvarchar(1),[Col4] nvarchar(1),[Col5] nvarchar(1),[Col6] nvarchar(1),[Col7] nvarchar(1),[Col8] nvarchar(1))
INSERT [tb]
SELECT N'a',N'b',N'c',N'a',N'b',N'b',null,null UNION ALL
SELECT N'd',N'b',N'c',N'y',null,N'c',N'a',N'a' UNION ALL
SELECT N'y',N'r',N'v',N'a',null,N'c',null,null
GO
--SELECT * FROM [tb]
-->SQL查询如下:
DECLARE @s VARCHAR(MAX),@s1 VARCHAR(MAX)
SELECT @s=ISNULL(@s+',','')+NAME FROM syscolumns WHERE OBJECT_ID('tb')=id
EXEC('
WITH T AS
(
SELECT *
FROM (SELECT RN=ROW_NUMBER()OVER(ORDER BY GETDATE()),* FROM TB) A
UNPIVOT(A FOR B IN('+@S+'))B
)
SELECT A,RN,C=''COL''+LTRIM(ROW_NUMBER()OVER(PARTITION BY RN ORDER BY B))
INTO ##
FROM T A
WHERE NOT EXISTS(
SELECT 1
FROM T
WHERE RN=A.RN AND A=A.A AND B<A.B)
')
SELECT @s1=ISNULL(@s1+',','')+C FROM ## GROUP BY C
EXEC('
SELECT '+@S1+'
FROM ##
PIVOT(MAX(a) FOR C IN('+@S1+'))B;
DROP TABLE ##;')
/*
COL1 COL2 COL3 COL4 COL5
---- ---- ---- ---- ----
a b c NULL NULL
d b c y a
y r v a c
(3 行受影响)
*/
a b c a b b null null
d b c y null c a a
y r v a null c null null
合并同一行里的重复数据,合并完后的数据为
a b c null null
d b c y a
y r v a c
去除重复数据,但是首次出现的顺序不变
----------------------------------
/*---------------------------------
-- Author : htl258(Tony)
-- Date : 2009-09-11 10:36:58
-- Version: Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
Mar 29 2009 10:27:29
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
---------------------------------*/
--> 生成测试数据表:tb
IF NOT OBJECT_ID('[tb]') IS NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb]([Col1] nvarchar(1),[Col2] nvarchar(1),[Col3] nvarchar(1),[Col4] nvarchar(1),[Col5] nvarchar(1),[Col6] nvarchar(1),[Col7] nvarchar(1),[Col8] nvarchar(1))
INSERT [tb]
SELECT N'a',N'b',N'c',N'a',N'b',N'b',null,null UNION ALL
SELECT N'd',N'b',N'c',N'y',null,N'c',N'a',N'a' UNION ALL
SELECT N'y',N'r',N'v',N'a',null,N'c',null,null
GO
--SELECT * FROM [tb]
-->SQL查询如下:
DECLARE @s VARCHAR(MAX),@s1 VARCHAR(MAX)
SELECT @s=ISNULL(@s+',','')+NAME FROM syscolumns WHERE OBJECT_ID('tb')=id
EXEC('
WITH T AS
(
SELECT *
FROM (SELECT RN=ROW_NUMBER()OVER(ORDER BY GETDATE()),* FROM TB) A
UNPIVOT(A FOR B IN('+@S+'))B
)
SELECT A,RN,C=''COL''+LTRIM(ROW_NUMBER()OVER(PARTITION BY RN ORDER BY B))
INTO ##
FROM T A
WHERE NOT EXISTS(
SELECT 1
FROM T
WHERE RN=A.RN AND A=A.A AND B<A.B)
')
SELECT @s1=ISNULL(@s1+',','')+C FROM ## GROUP BY C
EXEC('
SELECT '+@S1+'
FROM ##
PIVOT(MAX(a) FOR C IN('+@S1+'))B;
DROP TABLE ##;')
/*
COL1 COL2 COL3 COL4 COL5
---- ---- ---- ---- ----
a b c NULL NULL
d b c y a
y r v a c
(3 行受影响)
*/
相关文章推荐
- SQL合并统一数据(相同的在一行显示)
- oracle中如何把表中具有相同值列的多行数据合并成一行
- Excel怎样把相同列数据合并到一行
- 同一个数据库里,两个相同字段但是顺序不同的数据表合并教程
- 关于结构相同,数据不同的数据库进行一个表数据合并入另一个数据库中的表
- 在Excel中使用VBA合并相同的数据 保留不同的数据(或替换不同的数据)
- 将一列具有相同数据的行合并到同一行
- T_SQL 将一列多行数据合并为一行
- 将多行数据合并成一行
- left join 关联相同两张表,并将关联表的分别两条数据,整体合并为一条
- 合并俩Map相同的key,value相加,不同的key追加
- sql 不同服务器,相同数据库导数据;一台服务器,不同数据库导数据
- 相同程序不同进程下实现数据共享
- DLL在多个相同或不同的exe之间共享静态数据
- Sql:多行合并一行以及多条数据取时间最早的那条
- 合并多行查询数据到一行:使用自连接、FOR XML PATH('')、STUFF或REPLACE函数
- 【SQL】根据多行记录的公共属性,将不同类型对应的值合并到一行中
- 顺序表的合并(无序合并且相同数据不在插入) 严蔚敏(c语言版)
- 网络请求参数不同却得到相同数据的调查
- SQL Sever中使用SQL语句实现把重复行数据合并为一行并用逗号分隔