2016-09-12 59 views
1

第一次在这里发布海报,所以请原谅不幸。将一列分成几个

我在sql中有一个查询,为了简单起见,会返回持续时间,业务持续时间和受影响的服务。问题在于如果它受到影响的服务,有时它在行中有多个值。例如,它可以是'crm,payrol和调度'。见下文。

持续时间长的业务影响服务 60 40 CRM 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 

你会怎么做呢?

谢谢!

+0

解决这个问题的最佳方法是停止在单个单元中填充多个值。这违反了1NF并引起无数的痛苦。要拆分这些数据需要某种类型的字符串拆分器。这里有几个很好的例子。 http://sqlperformance.com/2012/07/t-sql-queries/split-strings –

回答

1

一种方法使用分割功能。 Google上的“SQL Server分裂功能”。那么你将有一个分裂的功能。

可以再用outer apply做到这一点:如果需要

select t.duration, t.business_duration, s.impacted_service 
from t outer apply 
    (dbo.split(t.impacted_service)) s(impacted_service); 
+0

谢谢!这工作完美! –

1

这里是另一种选择

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 

返回

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 
+1

这是一个有效的方法。 – AVK

+0

谢谢!然而,这也很好,因为我简化了这个问题,这对我来说不会太好。但是我把它存储在我有用的东西中。非常感谢!! –