2012-03-15 52 views
1

我想使用SQL(不usnig TSQL /循環等)在表如何將單元格中的CSV值轉換爲Rows和UnPivot?

Name DependsOn-CSV 
---- ------------- 
a  b,c 
b  d 
c 
d 
e  g 
f  b,e,a,g 
g 
h  a 

數據轉換爲

Name DependsOn-Rows 
---- -------------- 
a  b 
a  C 
b  d 
c 
d 
e  g 
f  b 
f  e 
f  a 
f  g 
g 
h  a 

然後

C1 C2 C3 C4 C5 
-- -- -- -- -- 
f 
    b 
     d 
    e 
     g 
    a 
     b 
      d 
     c 
    g 
h 
    a 
     b 
      d 
     c 

。這可以做到嗎?


更新:我從關係角度思考。因此,請不要在問題的第一部分使用XML,OpenQuery等。這裏有一個與關係設計相關的問題,這就是挑戰!

+5

得到最後一張表的邏輯是什麼? – 2012-03-15 06:58:48

+2

@Igor:很可能它是一棵顯示依賴關係的樹。列位置對應於它包含的節點的層級。每隔一行包含一個與當前的項目有關的項目,以三種方式之一:一個孩子,一個兄弟姐妹,一個父母的兄弟姐妹。但是,OP應該澄清這一點。 – 2012-03-15 08:53:32

+0

是........... :) – Faiz 2012-03-25 06:18:33

回答

1

你可以通過這樣得到的第一個結果:

測試數據

DECLARE @tbl TABLE(Name VARCHAR(100),DependsOnCSV VARCHAR(100)) 

INSERT INTO @tbl 
VALUES 
    ('a','b,c'), 
    ('b','d'), 
    ('c',''), 
    ('d',''), 
    ('e','g'), 
    ('f','b,e,a,g'), 
    ('g',''), 
    ('h','a') 

拆分功能

CREATE FUNCTION Split 
(
    @delimited nvarchar(max), 
    @delimiter nvarchar(100) 
) RETURNS @t TABLE 
(
    id int identity(1,1), 
    val nvarchar(max) 
) 
AS 
BEGIN 
    declare @xml xml 
    set @xml = N'<root><r>' + replace(@delimited,@delimiter,'</r><r>') + '</r></root>' 

    insert into @t(val) 
    select 
    r.value('.','varchar(5)') as item 
    from @xml.nodes('//root/r') as records(r) 

    RETURN 
END 
GO 

替代分流的功能

CREATE FUNCTION dbo.Split (@s varchar(512),@sep char(1)) 
RETURNS table 
AS 
RETURN (
    WITH Pieces(pn, start, stop) AS (
     SELECT 1, 1, CHARINDEX(@sep, @s) 
     UNION ALL 
     SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1) 
     FROM Pieces 
     WHERE stop > 0 
    ) 
    SELECT pn, 
     SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s 
    FROM Pieces 
) 
GO 

查詢

SELECT 
    tbl.Name, 
    split.val AS [DependsOn-Rows] 
FROM @tbl AS tbl 
CROSS APPLY dbo.Split(tbl.DependsOnCSV,',') split 

然後,我真的不知道如何獲得第二個結果。你必須解釋更多

+0

好東西:) 雖然我不喜歡xml操作,因爲我正在尋找一個純關係的答案。我個人認爲xml操作和OpenQuery()調用一樣好。真誠感謝你的努力,做好工作。 – Faiz 2012-03-25 07:14:44

+0

道歉,第二次看,我認爲你已經解決了這個問題,使用關係方法(CROSS APPLY)。該功能可以在不使用xml的情況下重寫。謝謝.. 讓我們關注第二部分吧.. – Faiz 2012-03-25 07:31:42

相關問題