Sql server 查询中的多行来自一行

Sql server 查询中的多行来自一行,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,我试图从我的数据库中创建一个查询,该查询将根据计数列将每一行扩展到多行。我需要的是拿我的桌子: [DATE] [COUNT] [OTHER_COLUMN] 20120101 3 X 20120201 2 Y 并创建以下内容: [DATE] [OTHER_COLUMN] 20120101 X 20120101 X 20120101 X 20120201 Y 20120201 Y 我已经找到了很多相反的方

我试图从我的数据库中创建一个查询,该查询将根据计数列将每一行扩展到多行。我需要的是拿我的桌子:

[DATE]     [COUNT]     [OTHER_COLUMN]
20120101   3           X
20120201   2           Y
并创建以下内容:

[DATE]     [OTHER_COLUMN]
20120101   X
20120101   X
20120101   X
20120201   Y
20120201   Y

我已经找到了很多相反的方法,可以将多行合并为一行,或者将一行多列扩展为多行,基于每列一行,但是我似乎找不到创建相同行的方法。我使用的是SQL Server 2012。

为此,您需要一个类似以下的计数表:

然后你可以写:

SELECT [Date], Other_Column
FROM dbo.MyTable
CROSS APPLY dbo.GetNums([COUNT]);

下面是一个SQL FIDLE来显示正在运行的解决方案:

您可以使用递归CTE:

;WITH CTE AS
(
    SELECT *, 1 RN
    FROM YourTable
    UNION ALL
    SELECT [DATE], [COUNT], [OTHER_COLUMN], RN+1
    FROM CTE
    WHERE RN+1 <= [COUNT]
)
SELECT [DATE], [OTHER_COLUMN]
FROM CTE
OPTION(MAXRECURSION 0)

你可以试试。

另一种方法。请注意,您应该有[count]@bluefeet谢谢,现在添加了一个fiddle。这会导致每个递归步骤扫描一次表。如果表增长或计数增长,这将非常缓慢。@SebastianMeine它实际上不一定每次递归扫描表一次。在所讨论的小提琴中,查询扫描表一次。不过,这并不意味着它不会很慢,尽管我只是在统计IO的情况下运行了你的版本。输出在表上显示1个逻辑读取,在工作表上显示29个逻辑读取。因此,表只扫描一次是正确的,但是总共还是30次逻辑读取。“我的解决方案只需要一个逻辑解读就可以了。”塞巴斯蒂安·梅因:事实上,这很好。这只是问题的一个替代方案。我决不会为我的答案辩护,也不会批评你的答案。
WITH num AS (
    SELECT number
    FROM master..spt_values WHERE type = 'P' 
)
SELECT 
    [DATE],[OTHER_COLUMN]
FROM your_table t
INNER JOIN num n
    ON n.number < t.COUNT