gpt4 book ai didi

sql-server - 在 SQL Server 中将一行划分为 (num) 行

转载 作者:行者123 更新时间:2023-12-01 00:36:39 25 4
gpt4 key购买 nike

我有以下形式的数据:

ID         name     date    count
---------------------------------
1 A 1/1/2015 3
2 B 1/4/2015 2
3 C 1/6/2015 4
4 D 1/10/2015 2

我想把它变成类似...

1 A 1/1/2015
1 A 1/2/2015
1 A 1/3/2015
2 B 1/4/2015
2 B 1/5/2015
3 C 1/6/2015
...

我相信使用分区查询是可能的,但我在理解 examples I find on the MS page 时遇到了真正的问题.我需要在 DATEADD 中使用 ROW_NUMBER,但我不知道如何让它返回正确的行数,对于第一种情况来说是 3。 TerritoryName 示例似乎很接近...

在最坏的情况下,我可以在 VBA 代码中执行此操作,而且我也知道使用充满日期的表格的解决方案,但我认为如果可能的话,我应该知道如何在 SELECT 中执行此操作。

更新:我不能更改原始数据库中的任何内容(许可问题)。我可以使用 #blah,但如果可能的话我宁愿避免这种情况。

最佳答案

这就是计数表是完成这项工作的正确工具的地方。我在我的系统上保留一个 View 。它快得离谱。

create View [dbo].[cteTally] as

WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N from cteTally
GO

现在我们只需要一些示例数据,然后我们就可以加入我们的理货表。

set dateformat mdy --you really should use ANSI standard YYYYMMDD

insert @Something values
(1, 'A', '1/1/2015', 3)
,(2, 'B', '1/4/2015', 2)
,(3, 'C', '1/6/2015', 4)
,(4, 'D', '1/10/2015', 2)

select s.*
, DATEADD(day, t.N - 1, s.SomeDate)
from @Something s
join cteTally t on t.N <= s.SomeCount

由于您无法创建 View ,因此您也可以稍微削减此 cte 以满足您当前的需求,并让 cte 出现在您的查询中。像这样。

WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E1
)
select s.*
, DATEADD(day, t.N - 1, s.SomeDate)
from @Something s
join cteTally t on t.N <= s.SomeCount

关于sql-server - 在 SQL Server 中将一行划分为 (num) 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49372105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com