2017-09-25 32 views
0

区切り文字を使用して列の値を1つに分割する必要があります。SQL Serverを使用して区切り文字で列を分割する

create table #a 
(
    id int, 
    timeline varchar(100) 
) 

insert into #a 
values (1, 'Semi Annual Q2 (May/June/July) & Q4 (Nov/Dec/Jan)'), 
     (2, 'Semi Annual Q1 (Feb/Mar/Apr) & Q3 (Aug/Sep/Oct)'), 
     (3, 'Annual Q3 (Aug/Sep/Oct)'), 
     (4, 'Annual Q2 (May/June/July)'), 
     (5, 'Annual Q4 (Nov/Dec/Jan)'), 
     (6, 'Semi Annual Q1 (Jan/Feb/Mar) & Q3 (July/Aug/Sep)') 

select * from #a 

私は「/」区切り文字でタイムラインの値を分割して別々の月とすべての月の別の列を作りたいの出力は、以下のサンプルのように見えた、順番にする必要があります。

ID M1 M2 M3 M4 M5 M6 
--------------------------------------- 
1 May June July Nov Dec Jan 
2 Feb Mar Apr Aug Sep Oct 
3 Aug Sep Oct NULL NULL NULL 
4 May June July NULL NULL NULL 
5 Nov Dec Jan NULL NULL NULL 
6 Jan Feb Mar July Aug Sep 

はこれまでのところ、私はこれを試してみました:

コードではなく、あまりにも退屈
select 
    timeline, 
    substring((substring(timeline, CHARINDEX('(', timeline) + 1, len(timeline) - 1)), 1, charindex('/', substring(timeline, CHARINDEX('(', timeline) + 1, len(timeline) - 1)) - 1) as M1, 
    replace(replace(right(substring(substring(timeline, CHARINDEX('(', timeline) + 1, len(timeline)), 1, charindex(')', substring(timeline, CHARINDEX('(', timeline) + 1, len(timeline)))), charindex('/', reverse(substring(substring(timeline, CHARINDEX('(', timeline) + 1, len(timeline)), 1, charindex(')', substring(timeline, CHARINDEX('(', timeline) + 1, len(timeline))))), 4)), '/', ''), ')', '') as M3 
from 
    #a; 

。あなたがこれを行う効率的な方法を持っているなら、助けてください。ここで

は、溶液中でそれを使用する方法です

+1

Jeff ModenのDelimitedSplit8K関数は、このトリックを行う必要があります。ここで見つけることができます。http://www.sqlservercentral.com/articles/Tally+Table/72993/ –

+1

I al Jeffのスプリッタをお勧めします。しかしそれ以上には、区切られたデータを格納する方法を終了することをお勧めします。それは1NFに違反し、苦痛をたくさん引き起こします。 –

+0

[列にコンマ区切り値を分割する方法](https://stackoverflow.com/questions/10581772/how-to-split-a-comma-separated-value-to-columns) –

答えて

1

以下の溶液中で使用されているSplitCSVToTable8K機能、上記と同じDelimitedSplit8K機能です...:

WITH 
    cte_ParseTimeline AS (
     SELECT 
      a.id, 
      rn = ROW_NUMBER() OVER (PARTITION BY a.id ORDER BY sc.ItemNumber), 
      sc.Item 
     FROM 
      #a a 
      CROSS APPLY dbo.SplitCSVToTable8K(REPLACE(REPLACE(a.timeline, '(', '/'), ')', '/'), '/') sc 
     WHERE 
      sc.Item LIKE ('[A-Z][a-z][a-z]') 
      OR 
      sc.Item LIKE ('[A-Z][a-z][a-z][a-z]') 
     ) 
SELECT 
    pt.id, 
    M1 = MAX(CASE WHEN pt.rn = 1 THEN pt.Item END), 
    M2 = MAX(CASE WHEN pt.rn = 2 THEN pt.Item END), 
    M3 = MAX(CASE WHEN pt.rn = 3 THEN pt.Item END), 
    M4 = MAX(CASE WHEN pt.rn = 4 THEN pt.Item END), 
    M5 = MAX(CASE WHEN pt.rn = 5 THEN pt.Item END), 
    M6 = MAX(CASE WHEN pt.rn = 6 THEN pt.Item END) 
FROM 
    cte_ParseTimeline pt 
GROUP BY 
    pt.id; 

結果...

id   M1 M2 M3 M4 M5 M6 
----------- ----- ----- ----- ----- ----- ----- 
1   May June July Nov Dec Jan 
2   Feb Mar Apr Aug Sep Oct 
3   Aug Sep Oct NULL NULL NULL 
4   May June July NULL NULL NULL 
5   Nov Dec Jan NULL NULL NULL 
6   Jan Feb Mar July Aug Sep 
+0

@Jayank - フィードバックありがとうございます。私はhepできることがうれしいです。 :) –

関連する問題