表编号 产品 数量 单价 金额 序列号001 AA 3 5 15 12,13,14002 bb 3 5 15 22,23,24现在需要显示的效果为编号 产品 数量 单价 金额 序列号001 AA 1 5 5 12
001 AA 1 5 5 13
001 AA 1 5 5 14002 bb 1 5 5 22
002 bb 1 5 5 23
002 bb 1 5 5 24
001 AA 1 5 5 13
001 AA 1 5 5 14002 bb 1 5 5 22
002 bb 1 5 5 23
002 bb 1 5 5 24
-- Author :DBA_Huangzj(發糞塗牆)
-- Date :2013-09-17 15:03:36
-- Version:
-- Microsoft SQL Server 2014 (CTP1) - 11.0.9120.5 (X64)
-- Jun 10 2013 20:09:10
-- Copyright (c) Microsoft Corporation
-- Enterprise Evaluation Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据:[huang]
if object_id('[huang]') is not null drop table [huang]
go
create table [huang]([编号] varchar(3),[产品] varchar(2),[数量] int,[单价] int,[金额] int,[序列号] varchar(8))
insert [huang]
select '001','AA',3,5,15,'12,13,14' union all
select '002','bb',3,5,15,'22,23,24'
--------------开始查询--------------------------select 编号 , 产品 , 数量, 单价 , 金额,SUBSTRING([序列号],number,CHARINDEX(',',[序列号]+',',number)-number) as [序列号]
from [huang] a,master..spt_values
where
number >=1 and number<len([序列号])
and type='p'
and substring(','+[序列号],number,1)=','
----------------结果----------------------------
/*
编号 产品 数量 单价 金额 序列号
---- ---- ----------- ----------- ----------- --------
001 AA 3 5 15 12
001 AA 3 5 15 13
001 AA 3 5 15 14
002 bb 3 5 15 22
002 bb 3 5 15 23
002 bb 3 5 15 24
*/
--字段拆分:
IF OBJECT_ID('tempdb..#temp') IS NOT NULL
DROP TABLE #temp
GO
CREATE TABLE #temp
(
编号 INT IDENTITY,
产品 nvarchar(max),
数量 int,
单价 int,
金额 int,
序列号 NVARCHAR(MAX)
)
INSERT #temp
SELECT 'AA',3,5,15,'12,13,14' UNION ALL
SELECT 'bb',3,5,15,'22,23,24'
GO
select * from #temp
--#1.SQL2000 辅助表拆分方法
SELECT
a.编号,a.产品,a.数量,a.单价,a.金额,
序列号 = SUBSTRING(a.序列号, b.number, CHARINDEX(',', a.序列号+',', b.number) - b.number)
FROM #temp a
INNER JOIN master..spt_values b
ON b.type = 'p' AND b.number BETWEEN 1 AND LEN(a.序列号)
WHERE SUBSTRING(','+a.序列号, b.number, 1) = ','
;WITH cte AS
(
SELECT
编号,
产品,数量,单价,金额,
序列号 = CAST(LEFT(序列号, CHARINDEX(',', 序列号 + ',') - 1) AS NVARCHAR(MAX)),
Split = CAST(STUFF(序列号 + ',', 1, CHARINDEX(',', 序列号 + ','), '') AS NVARCHAR(MAX))
FROM #temp
UNION ALL
SELECT
编号,
产品,数量,单价,金额,
序列号 = CAST(LEFT(Split, CHARINDEX(',', Split) - 1) AS NVARCHAR(MAX)),
Split = CAST(STUFF(Split, 1, CHARINDEX(',', Split), '') AS NVARCHAR(MAX))
FROM cte
WHERE Split > ''
)
SELECT
编号,
产品,数量,单价,金额,
序列号
FROM cte
ORDER BY 编号
OPTION (MAXRECURSION 0)
貌似里面有一列number里面有一些就是1,2,3,4,5,但是不会哦