### 字符串截取問題

S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);
S(1);M(1);XL(1);
S(1);M(1);XL(1);
S(0.8);M(1);XL(1.2);
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);
S(1);M(1);XL(1);
S(0.8);M(1);XL(1.2);

S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);
S M L XL XXL  XXXL
0.5 0.9 1 1.1 1.2         1.5

## 6 个解决方案

### #3

```
;WITH s(ID,st) AS (
SELECT  1,'S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);' UNION ALL
SELECT  2,'S(1);M(1);XL(1);' UNION ALL
SELECT  3,'S(1);M(1);XL(1);' UNION ALL
SELECT  4,'S(0.8);M(1);XL(1.2);' UNION ALL
SELECT  5,'S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);' UNION ALL
SELECT  6,'S(1);M(1);XL(1);' UNION ALL
SELECT  7,'S(0.8);M(1);XL(1.2);'
)
SELECT s.st,j.* FROM s
CROSS APPLY (VALUES(CONVERT(XML, '<n>'+REPLACE(s.st,';','</n><n>')+'</n>'))) n(x)
CROSS APPLY(SELECT a.b.value('.','varchar(100)') AS e FROM n.x.nodes('n') a(b))c
CROSS APPLY(VALUES(LEFT(c.e,CHARINDEX('(',c.e)-1),SUBSTRING(c.e,CHARINDEX('(',c.e)+1,CHARINDEX(')',c.e)-CHARINDEX('(',c.e)-1))) j(k,kk)
WHERE len(c.e)>0
/*
st	k	kk
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	S	0.5
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	M	0.9
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	L	1
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	XL	1.1
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	XXL	1.2
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	XXXL	1.5
S(1);M(1);XL(1);	S	1
S(1);M(1);XL(1);	M	1
S(1);M(1);XL(1);	XL	1
S(1);M(1);XL(1);	S	1
S(1);M(1);XL(1);	M	1
S(1);M(1);XL(1);	XL	1
S(0.8);M(1);XL(1.2);	S	0.8
S(0.8);M(1);XL(1.2);	M	1
S(0.8);M(1);XL(1.2);	XL	1.2
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	S	0.5
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	M	0.9
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	L	1
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	XL	1.1
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	XXL	1.2
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	XXXL	1.5
S(1);M(1);XL(1);	S	1
S(1);M(1);XL(1);	M	1
S(1);M(1);XL(1);	XL	1
S(0.8);M(1);XL(1.2);	S	0.8
S(0.8);M(1);XL(1.2);	M	1
S(0.8);M(1);XL(1.2);	XL	1.2
*/
```

### #4

```USE [jiepuzai]
GO
/****** Object:  Table [dbo].[訂單信息表]    Script Date: 08/26/2016 10:08:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
GO
CREATE TABLE [dbo].[訂單信息表](
[訂單ID] [nvarchar](100) NOT NULL,
[訂單號] [nvarchar](100) NULL,
[款式編號] [nvarchar](50) NULL,
[計划交期類別] [nvarchar](100) NULL,
[開發計划類別] [nvarchar](100) NULL,
[款式類別] [nvarchar](100) NULL,
[訂單數] [int] NULL,
[打樣次數] [int] NULL,
[打樣日期] [date] NULL,
[客戶] [nvarchar](100) NULL,
[尺碼組] [nvarchar](100) NULL,
[尺碼] [nvarchar](100) NULL,
[推算尺碼] [nvarchar](max) NULL,
[布色] [nvarchar](max) NULL,
[印花工藝] [nvarchar](max) NULL,
[打樣件數] [int] NULL,
[計划成本] [float] NULL,
[用色總數] [int] NULL,
[用料重量] [float] NULL,
[原料總價] [float] NULL,
[打樣評語] [nvarchar](max) NULL,
[備注] [nvarchar](max) NULL,
[跟單員] [nvarchar](255) NULL,
[收到AI] [date] NULL,
[收到SO布] [date] NULL,
[收到位置] [date] NULL,
[SO送出日] [date] NULL,
[SO核可日] [date] NULL,
[收到PP樣布] [date] NULL,
[PP送出日] [date] NULL,
[PP核可日] [date] NULL,
[PP樣衣] [date] NULL,
[大貨位置版] [date] NULL,
[計划交期] [date] NULL,
[工藝圖片] [nvarchar](100) NULL,
[打樣圖片] [nvarchar](100) NULL,
[是否已審核] [varchar](50) NULL,
[是否停用] [varchar](50) NULL,
[操作者] [nvarchar](100) NULL,
[下單時間] [datetime] NULL,
[是否已完成] [nvarchar](10) NULL,
CONSTRAINT [PK_訂單信息表] PRIMARY KEY CLUSTERED
(
[訂單ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
GO
INSERT [dbo].[訂單信息表] ([訂單ID], [訂單號], [款式編號], [計划交期類別], [開發計划類別], [款式類別], [訂單數], [打樣次數], [打樣日期], [客戶], [尺碼組], [尺碼], [推算尺碼], [布色], [印花工藝], [打樣件數], [計划成本], [用色總數], [用料重量], [原料總價], [打樣評語], [備注], [跟單員], [收到AI], [收到SO布], [收到位置], [SO送出日], [SO核可日], [收到PP樣布], [PP送出日], [PP核可日], [PP樣衣], [大貨位置版], [計划交期], [工藝圖片], [打樣圖片], [是否已審核], [是否停用], [操作者], [下單時間], [是否已完成]) VALUES (N'010e9bf85cac4705a7cad2ab93f2971b', N'20160818201911', N'888888', N'計划交期1', N'開發計划類A', N'復古', 234, 3, CAST(0xC33B0B00 AS Date), N'李思思', N'尺碼組3', N'L', N'S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);', N'333', N'', 3, 2, 2, 0.0536, 0.11149, N'第三次打樣', N'禾禾禾', N'李四', CAST(0xC13B0B00 AS Date), CAST(0xC43B0B00 AS Date), CAST(0xCA3B0B00 AS Date), CAST(0xC43B0B00 AS Date), CAST(0xCB3B0B00 AS Date), CAST(0xC93B0B00 AS Date), CAST(0xC93B0B00 AS Date), CAST(0xCA3B0B00 AS Date), CAST(0xCB3B0B00 AS Date), CAST(0xCF3B0B00 AS Date), CAST(0x5B950A00 AS Date), N'b70710568e32437a834fa5c8587b7bb8', N'7181c2cd7664492e91599082a3da3dc0', N'否', N'否', N'admin', CAST(0x0000A66800E09688 AS DateTime), N'否')
INSERT [dbo].[訂單信息表] ([訂單ID], [訂單號], [款式編號], [計划交期類別], [開發計划類別], [款式類別], [訂單數], [打樣次數], [打樣日期], [客戶], [尺碼組], [尺碼], [推算尺碼], [布色], [印花工藝], [打樣件數], [計划成本], [用色總數], [用料重量], [原料總價], [打樣評語], [備注], [跟單員], [收到AI], [收到SO布], [收到位置], [SO送出日], [SO核可日], [收到PP樣布], [PP送出日], [PP核可日], [PP樣衣], [大貨位置版], [計划交期], [工藝圖片], [打樣圖片], [是否已審核], [是否停用], [操作者], [下單時間], [是否已完成]) VALUES (N'378c06c4415d4c679869151d3d18ffc1', N'20160819182621', N'3333', N'計划交期1', N'開發計划類C', N'純色', 33, 1, CAST(0xC33B0B00 AS Date), N'李思思', N'尺碼組1', N'M', N'S(1);M(1);XL(1);', N'33', N'333', 3, 1, 2, 0.0231, 0.09247, N'', N'222', N'張三', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, CAST(0xC33B0B00 AS Date), N'', N'', N'否', N'否', N'101', CAST(0x0000A66701305BA0 AS DateTime), N'否')
/****** Object:  Default [DF_訂單信息表_計划成本]    Script Date: 08/26/2016 10:08:29 ******/
ALTER TABLE [dbo].[訂單信息表] ADD  CONSTRAINT [DF_訂單信息表_計划成本]  DEFAULT ((0)) FOR [計划成本]
GO
/****** Object:  Default [DF_訂單信息表_是否已審核]    Script Date: 08/26/2016 10:08:29 ******/
ALTER TABLE [dbo].[訂單信息表] ADD  CONSTRAINT [DF_訂單信息表_是否已審核]  DEFAULT ('否') FOR [是否已審核]
GO
/****** Object:  Default [DF_訂單信息表_是否停用]    Script Date: 08/26/2016 10:08:29 ******/
ALTER TABLE [dbo].[訂單信息表] ADD  CONSTRAINT [DF_訂單信息表_是否停用]  DEFAULT ('否') FOR [是否停用]
GO
/****** Object:  Default [DF_訂單信息表_是否已完成]    Script Date: 08/26/2016 10:08:29 ******/
ALTER TABLE [dbo].[訂單信息表] ADD  CONSTRAINT [DF_訂單信息表_是否已完成]  DEFAULT ('否') FOR [是否已完成]
GO
```

### #5

```
;WITH s(ID,st) AS (
SELECT  1,'S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);' UNION ALL
SELECT  2,'S(1);M(1);XL(1);' UNION ALL
SELECT  3,'S(1);M(1);XL(1);' UNION ALL
SELECT  4,'S(0.8);M(1);XL(1.2);' UNION ALL
SELECT  5,'S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);' UNION ALL
SELECT  6,'S(1);M(1);XL(1);' UNION ALL
SELECT  7,'S(0.8);M(1);XL(1.2);'
)
SELECT s.st,j.* FROM s
CROSS APPLY (VALUES(CONVERT(XML, '<n>'+REPLACE(s.st,';','</n><n>')+'</n>'))) n(x)
CROSS APPLY(SELECT a.b.value('.','varchar(100)') AS e FROM n.x.nodes('n') a(b))c
CROSS APPLY(VALUES(LEFT(c.e,CHARINDEX('(',c.e)-1),SUBSTRING(c.e,CHARINDEX('(',c.e)+1,CHARINDEX(')',c.e)-CHARINDEX('(',c.e)-1))) j(k,kk)
WHERE len(c.e)>0
/*
st	k	kk
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	S	0.5
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	M	0.9
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	L	1
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	XL	1.1
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	XXL	1.2
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	XXXL	1.5
S(1);M(1);XL(1);	S	1
S(1);M(1);XL(1);	M	1
S(1);M(1);XL(1);	XL	1
S(1);M(1);XL(1);	S	1
S(1);M(1);XL(1);	M	1
S(1);M(1);XL(1);	XL	1
S(0.8);M(1);XL(1.2);	S	0.8
S(0.8);M(1);XL(1.2);	M	1
S(0.8);M(1);XL(1.2);	XL	1.2
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	S	0.5
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	M	0.9
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	L	1
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	XL	1.1
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	XXL	1.2
S(0.5);M(0.9);L(1);XL(1.1);XXL(1.2);XXXL(1.5);	XXXL	1.5
S(1);M(1);XL(1);	S	1
S(1);M(1);XL(1);	M	1
S(1);M(1);XL(1);	XL	1
S(0.8);M(1);XL(1.2);	S	0.8
S(0.8);M(1);XL(1.2);	M	1
S(0.8);M(1);XL(1.2);	XL	1.2
*/
```

### #6

```
SELECT s.*,j.*  FROM 訂單信息表 as s
CROSS APPLY (VALUES(CONVERT(XML, '<n>'+REPLACE(s.推算尺碼,';','</n><n>')+'</n>'))) n(x)
CROSS APPLY(SELECT a.b.value('.','varchar(100)') AS e FROM n.x.nodes('n') a(b))c
CROSS APPLY(VALUES(LEFT(c.e,CHARINDEX('(',c.e)-1),SUBSTRING(c.e,CHARINDEX('(',c.e)+1,CHARINDEX(')',c.e)-CHARINDEX('(',c.e)-1))) j(k,kk)
WHERE len(c.e)>0
```

```
--放入臨時表，否則語句太啰嗦
SELECT s.*,j.* INTO  #t1 FROM 訂單信息表 as s
CROSS APPLY (VALUES(CONVERT(XML, '<n>'+REPLACE(s.推算尺碼,';','</n><n>')+'</n>'))) n(x)
CROSS APPLY(SELECT a.b.value('.','varchar(100)') AS e FROM n.x.nodes('n') a(b))c
CROSS APPLY(VALUES(LEFT(c.e,CHARINDEX('(',c.e)-1),SUBSTRING(c.e,CHARINDEX('(',c.e)+1,CHARINDEX(')',c.e)-CHARINDEX('(',c.e)-1))) j(k,kk)
WHERE len(c.e)>0
--將進行轉置，有變回原訂單行數，將尺碼變為列
DECLARE @cols NVARCHAR(1000),@sql NVARCHAR(max)
SELECT  @cols=isnull(@cols+',','')+k FROM (SELECT DISTINCT k FROM #t1) t  --取出所有訂單涉及到的尺碼
SET @sql='SELECT * FROM #t1
PIVOT(MAX(kk) FOR k IN ('+@cols+')) n'
EXEC(@sql)

/*

2016-08-20 13:37:42.000	否	1	0.9	0.5	1.1	1.2	1.5
2016-08-19 18:28:08.000	否	NULL	1	1	1	NULL	NULL
*/

```