想要 1 行中的多行
Want multiple Rows from 1 Row
我在 SQL 服务器中有一个 table 像这样(示例):
ID
文章
艺术文字
计数
1
123456
测试 1
5
2
324644
blabla
1
3
765456
娜娜娜
12
现在要对这些项目进行标记。 IE。每个副本都需要一个标签。然后我通过 SSRS 执行此操作。
所以我需要 ID 1 5 个标签,ID 2 1,ID 3 12。
现在的问题是 select 从 ID 1 中获取 5 行,从 ID 2 中获取 1 行,从 ID 3 中获取 12 行。
我猜是 CTE,但我不清楚如何获得 x 倍的记录
期待您的想法。
如果我没理解错的话,你想乘以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)
。
我会在(慢得多的)rCTE 解决方案上使用 Tally。我在这里使用在线计数。如果您需要超过 100 行,只需在定义为 Tally
的 CTE 中向 N
添加更多交叉联接(每个交叉联接将最大行数增加一个因子或 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;
我在 SQL 服务器中有一个 table 像这样(示例):
ID | 文章 | 艺术文字 | 计数 |
---|---|---|---|
1 | 123456 | 测试 1 | 5 |
2 | 324644 | blabla | 1 |
3 | 765456 | 娜娜娜 | 12 |
现在要对这些项目进行标记。 IE。每个副本都需要一个标签。然后我通过 SSRS 执行此操作。
所以我需要 ID 1 5 个标签,ID 2 1,ID 3 12。
现在的问题是 select 从 ID 1 中获取 5 行,从 ID 2 中获取 1 行,从 ID 3 中获取 12 行。
我猜是 CTE,但我不清楚如何获得 x 倍的记录
期待您的想法。
如果我没理解错的话,你想乘以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)
。
我会在(慢得多的)rCTE 解决方案上使用 Tally。我在这里使用在线计数。如果您需要超过 100 行,只需在定义为 Tally
的 CTE 中向 N
添加更多交叉联接(每个交叉联接将最大行数增加一个因子或 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;