我现在有
A 表 id type
123 12;34
124 12;34;23
126 23
227 24结果是下面这样的
B 表
id type groups
123 12 0
123 34 1
124 12 0
124 34 1
124 23 2
126 23 0
227 24 0
........
........请帮忙解决一下。
数万量级的数据,主要是这么把这些数据拆分后使groups字段从0递增,因为type是不确定的。
A 表 id type
123 12;34
124 12;34;23
126 23
227 24结果是下面这样的
B 表
id type groups
123 12 0
123 34 1
124 12 0
124 34 1
124 23 2
126 23 0
227 24 0
........
........请帮忙解决一下。
数万量级的数据,主要是这么把这些数据拆分后使groups字段从0递增,因为type是不确定的。
--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([col1] [nvarchar](10),[col2] [int])
INSERT INTO [tb]
SELECT 'a','1' UNION ALL
SELECT 'a','2' UNION ALL
SELECT 'b','1' UNION ALL
SELECT 'b','2' UNION ALL
SELECT 'b','3'
-->SQL查询如下:
SELECT rn = ROW_NUMBER()OVER(ORDER BY GETDATE()), col1, SUM(col2) col2
FROM tb
GROUP BY col1
/*
rn col1 col2
-------------------- ---------- -----------
1 a 3
2 b 6(2 行受影响)
*/--2kSELECT rn = IDENTITY(INT), col1, SUM(col2) col2 INTO #
FROM tb
GROUP BY col1
SELECT * FROM #
DROP TABLE #
/*
rn col1 col2
-------------------- ---------- -----------
1 a 3
2 b 6(2 行受影响)
*/
drop function f_split
go
create function f_split(@Input varchar(2000),@split varchar(10))
returns @re table(id int identity,strs varchar(20))
begin
declare @index int
while charindex(@split,@Input)>0
begin
set @index=charindex(@split,@Input)
insert into @re values(left(@Input,@index-1))
set @Input=right(@Input,len(@Input)-@index)
end
if len(@Input)>0
insert into @re values(@Input)
return
end
goselect a.id,b.strs as type,b.id-1 as groups from tb a
cross apply f_split(a.type,';') b
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([id] [int],[type] [nvarchar](10))
INSERT INTO [tb]
SELECT '123','12;34' UNION ALL
SELECT '124','12;34;23' UNION ALL
SELECT '126','23' UNION ALL
SELECT '227','24'-->SQL查询如下:SELECT a.id, b.[type], groups
FROM (
SELECT id, [type] = CONVERT(XML, '<v>'+REPLACE([type], ';', '</v><v>')+'</v>')
FROM tb
) a
OUTER APPLY(
SELECT [type] = n.v.value('.', 'varchar(10)'), groups = ROW_NUMBER()OVER(ORDER BY @@spid)-1
FROM a.[type].nodes('/v') n(v)
) b
/*
id type groups
----------- ---------- --------------------
123 12 0
123 34 1
124 12 0
124 34 1
124 23 2
126 23 0
227 24 0(7 行受影响)
*/
在关键字 'OUTER' 附近有语法错误。
'ROW_NUMBER' 不是可以识别的 函数名。