将一列分成几列
splitting one column into several
第一次发帖,如有不妥请见谅。
我在 sql 中有一个查询,为了简单起见 returns 持续时间、业务持续时间和受影响的服务。问题在于,如果它影响服务,有时它在行中有多个值。例如,它可以是 'crm, payrol and scheduling'。见下文。
持续时间业务持续时间影响服务
60 40 厘米
100 95 工资单
70 70 调度
50 45 crm,调度,调度
我想要的是其中每个值的单独一行。像这样:
duration business duration impacted service
60 40 crm
50 45 crm
100 95 payroll
50 45 payroll
70 70 scheduling
50 45 scheduling
你会怎么做?
谢谢!
一种方法使用拆分函数。 Google "SQL Server split function" 在网络上。那么你就有了拆分功能。
然后您可以使用 outer apply
:
select t.duration, t.business_duration, s.impacted_service
from t outer apply
(dbo.split(t.impacted_service)) s(impacted_service);
还有一个选择
Declare @YourTable table (duration int,[business duration] int,[impacted service] varchar(50))
Insert Into @YourTable values
(60 ,40,'crm'),
(100,95,'payroll'),
(70 ,70,'scheduling'),
(50 ,45,'crm,payroll, scheduling')
Select Distinct
A.duration
,A.[business duration]
,[impacted service] = B.Key_Value
From @YourTable A
Cross Apply (Select * from [dbo].[udf-Str-Parse](A.[impacted service],',')) B
Returns
duration business duration impacted service
50 45 crm
50 45 payroll
50 45 scheduling
60 40 crm
70 70 scheduling
100 95 payroll
解析 UDF(如果需要)
CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimeter varchar(10))
--Usage: Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
-- Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')
Returns @ReturnTable Table (Key_PS int IDENTITY(1,1), Key_Value varchar(max))
As
Begin
Declare @XML xml;Set @XML = Cast('<x>' + Replace(@String,@Delimeter,'</x><x>')+'</x>' as XML)
Insert Into @ReturnTable Select ltrim(rtrim(String.value('.', 'varchar(max)'))) FROM @XML.nodes('x') as T(String)
Return
End
第一次发帖,如有不妥请见谅。
我在 sql 中有一个查询,为了简单起见 returns 持续时间、业务持续时间和受影响的服务。问题在于,如果它影响服务,有时它在行中有多个值。例如,它可以是 'crm, payrol and scheduling'。见下文。
持续时间业务持续时间影响服务 60 40 厘米 100 95 工资单 70 70 调度 50 45 crm,调度,调度
我想要的是其中每个值的单独一行。像这样:
duration business duration impacted service
60 40 crm
50 45 crm
100 95 payroll
50 45 payroll
70 70 scheduling
50 45 scheduling
你会怎么做?
谢谢!
一种方法使用拆分函数。 Google "SQL Server split function" 在网络上。那么你就有了拆分功能。
然后您可以使用 outer apply
:
select t.duration, t.business_duration, s.impacted_service
from t outer apply
(dbo.split(t.impacted_service)) s(impacted_service);
还有一个选择
Declare @YourTable table (duration int,[business duration] int,[impacted service] varchar(50))
Insert Into @YourTable values
(60 ,40,'crm'),
(100,95,'payroll'),
(70 ,70,'scheduling'),
(50 ,45,'crm,payroll, scheduling')
Select Distinct
A.duration
,A.[business duration]
,[impacted service] = B.Key_Value
From @YourTable A
Cross Apply (Select * from [dbo].[udf-Str-Parse](A.[impacted service],',')) B
Returns
duration business duration impacted service
50 45 crm
50 45 payroll
50 45 scheduling
60 40 crm
70 70 scheduling
100 95 payroll
解析 UDF(如果需要)
CREATE FUNCTION [dbo].[udf-Str-Parse] (@String varchar(max),@Delimeter varchar(10))
--Usage: Select * from [dbo].[udf-Str-Parse]('Dog,Cat,House,Car',',')
-- Select * from [dbo].[udf-Str-Parse]('John Cappelletti was here',' ')
Returns @ReturnTable Table (Key_PS int IDENTITY(1,1), Key_Value varchar(max))
As
Begin
Declare @XML xml;Set @XML = Cast('<x>' + Replace(@String,@Delimeter,'</x><x>')+'</x>' as XML)
Insert Into @ReturnTable Select ltrim(rtrim(String.value('.', 'varchar(max)'))) FROM @XML.nodes('x') as T(String)
Return
End