想要 1 行中的多行

时间:2021-07-01 09:47:14

标签: sql sql-server database tsql rdbms

我在 SQL Server 中有一个这样的表(示例):

<头>
ID 文章 ARTTEXT COUNT
1 123456 测试1 5
2 324644 blabla 1
3 765456 娜娜 12

现在这些物品要贴上标签。 IE。每个副本都需要一个标签。然后我通过 SSRS 执行此操作。

所以我需要从 ID 1 5 个标签,ID 2 1,ID 3 12。

现在的问题是从 ID 1 获取 5 行、从 ID 2 获取 1 行和从 ID 3 获取 12 行的选择是什么样的。

我猜是 CTE,但我不清楚如何获得 x 倍的记录

我期待您的想法。

2 个答案:

答案 0 :(得分:2)

我会在(慢得多的)rCTE 解决方案上使用 Tally。我在这里使用内联计数。如果您需要超过 100 行,只需在定义为 N 的 CTE 中向 Tally 添加更多交叉联接(每个交叉联接将最大行数增加一个因子或 10)。

CREATE TABLE dbo.YourTable (ID int,
                            Article int,
                            Arttext varchar(15),
                            [Count] int);
INSERT INTO dbo.YourTable
VALUES(1,123456,'Test1',5),
      (2,324644,'blabla',1),
      (3,765456,'nanana',12);

GO

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
    SELECT TOP (SELECT MAX([Count]) FROM dbo.YourTable)
           ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
    FROM N N1, N N2) --100 rows, add more cross joins for more rows
SELECT YT.ID,
       YT.Article,
       YT.Arttext,
       T.I AS [Count]
FROM dbo.YourTable YT
     JOIN Tally T ON YT.[Count] >= T.I
ORDER BY YT.ID,
         T.I;
GO


DROP TABLE dbo.YourTable;

答案 1 :(得分:0)

如果我理解正确,您想根据 count 乘以行数。一种方法使用递归 CTE:

with cte as (
      select id, article, arttext, count
      from t
      union all
      select id, article, arttext, count - 1
      from cte
      where count > 1
     )
select id, article, arttext
from t;

如果计数超过 100,那么您需要 option (maxrecursion 0)