2013-10-28 118 views
-1

有人可以幫我將記錄拆分成多行。將一條記錄拆分爲多行

我的記錄是這樣的

321517 2013 SEPTEMBER 3 30 286787 321517-2013 
321517 2013 SEPTEMBER 2 42 286787 321517-2013 

我希望他們看起來像這樣

321517 2013 SEPTEMBER 1 30 286787 321517-2013 
321517 2013 SEPTEMBER 1 30 286787 321517-2013 
321517 2013 SEPTEMBER 1 30 286787 321517-2013 
321517 2013 SEPTEMBER 1 42 286787 321517-2013 
321517 2013 SEPTEMBER 1 42 286787 321517-2013 
+0

RDBMS什麼您使用的是一個好名字的桌子嗎? – Taryn

+1

哪個SQL供應商/版本?這種「倒置」的分組計數是......並不那麼簡單或通用。 – user2864740

+1

如果您可以使用ID生成器表「加入」,則可以乘以該表。我的意思是從1開始增加1到最大需要的數字。而不是簡單的連接,你可以添加一個generator_table.id <= original_table.count。通過這種方式,這種準連接將成爲你想得到的。 –

回答

0

你可以嘗試這樣的事情。請注意,此查詢假定爲maximum value of your 4th Column is 10。如果您有更高的值,您可以添加more rows to the CTE using a cross join

;WITH CTE AS (
    select Digit 
    from (values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) AS t(Digit) 
) 
select C1, C2, C3, 1 C4, C5, C6, C7 
from Table1 join CTE on C4 > Digit 
order by C1 

Fiddle demo on sql server 2008

1

你可以得到最大可能的值,然後做一個遞歸CTE生成行。

;WITH MAX_VALUE AS (
    SELECT MAX(C4) AS VAL FROM Table1 
), 
TMP_ROWS AS (
    SELECT 1 AS PARENT, 0 AS LVL, 1 AS ID 

    UNION ALL 

    SELECT 
     CHILD.PARENT, 
     TMP_ROWS.LVL + 1 AS LVL, 
     TMP_ROWS.ID 
    FROM (SELECT 1 AS PARENT, 1 AS ID, 0 AS NIVEL) AS CHILD 
     INNER JOIN TMP_ROWS ON CHILD.PARENT = TMP_ROWS.ID 
    WHERE TMP_ROWS.LVL < (SELECT VAL FROM MAX_VALUE) 
) 
select C1, C2, C3, 1 C4, C5, C6, C7 
from Table1 join TMP_ROWS on C4 > TMP_ROWS.LVL 
order by C1, C2, C3, C5, C6, C7 

Demo (based on previuos reply data)

*編輯: 「行」 的心不是