将一列分成几列

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