6

我有一个表,我试图根据第二列的值将每一行分成一个或多个行。像这样:

table (id, pcs):
ABC   3
DEF   1
GHJ   4

query result (id, pcs_num):
ABC   1
ABC   2
ABC   3
DEF   1
GHJ   1
GHJ   2
GHJ   3
GHJ   4

我在 SQL Server 2008 中将其编写为 sproc。我最好的解决方案是使用游标并将 [pcs] 行数添加到表中每一行的临时表中。似乎必须有一个比我缺少的更简单的解决方案。谢谢。

4

3 回答 3

7

您可以使用递归 CTE:

;WITH CTE AS
(
    SELECT *
    FROM YourTable
    UNION ALL 
    SELECT id, pcs-1
    FROM CTE
    WHERE pcs-1 >= 1
)
SELECT *
FROM CTE
ORDER BY id, pcs
OPTION(MAXRECURSION 0)

这是一个演示供您尝试。

于 2012-11-14T19:15:31.623 回答
0

这是我的方法。使用计数表(只有一列值为 1 -> X 的表)非常容易。不需要递归,这比更大的表要快得多。

请注意,我们只制作了一个 100 行的 Tally 表,您可以随意扩展它。如果你太疯狂了,你可能需要在 sys.sysobjects 中进行另一个交叉连接来适应。真正的查询在底部,您可以看到它非常简单。

SELECT TOP 100
        IDENTITY( INT,1,1 ) AS N 
 INTO #Tally
FROM    sys.sysobjects sc1 ,

        sys.sysobjects  sc2

CREATE TABLE #Test
(
    Id char(3),
    pcs int
)

INSERT INTO #Test
SELECT 'ABC', 3 UNION ALL
SELECT 'DEF', 1 UNION ALL
SELECT 'GHJ', 4

SELECT #Test.Id, #Tally.N FROM #Tally
    JOIN #Test ON #Tally.N <= #Test.pcs
    ORDER BY #Test.Id
于 2012-11-14T19:20:46.373 回答
0
SELECT
  id
 ,pcs_num
FROM MyTable
CROSS APPLY (
  SELECT TOP (pcs)
    ROW_NUMBER() OVER(ORDER BY (SELECT 1)) pcs_num
  FROM master.dbo.spt_values
) t
于 2014-09-18T17:32:01.983 回答