2013-10-28 90 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)

*编辑: “行” 的心不是