我需要一个包含每个月记录的表,而不是具有重复计数字段的表。
我的数据目前如下所示:
Property Item Month Repeat_Count Amount
------------------------------------------------------------------
A Rent 1/1/2016 1 100
A Rent 2/1/2016 1 105
A Rent 3/1/2016 3 110
A Rent 6/1/2016 1 115
A Rent 7/1/2016 6 120
A Rent 1/1/2017 1 125
我希望它看起来像这样:
Property Item Month Amount
-----------------------------------------
A Rent 1/1/2016 100
A Rent 2/1/2016 105
A Rent 3/1/2016 110
A Rent 4/1/2016 110
A Rent 5/1/2016 110
A Rent 6/1/2016 115
A Rent 7/1/2016 120
A Rent 8/1/2016 120
A Rent 9/1/2016 120
A Rent 10/1/2016 120
A Rent 11/1/2016 120
A Rent 12/1/2016 120
A Rent 1/1/2017 125
希望我能很好地解释这一点,谢谢!
最佳答案
我会使用table of numbers和交叉应用
。
数字表只是一个表,其中有一列包含从 1 到某个足够大的数字(例如 100,000)的整数。我个人使用包含 100K 数字的表格。 Aaron Bertrand 写了一个 good article解释如何生成这样的表。
示例数据
DECLARE @T TABLE ([Property] varchar(50), [Item] varchar(50), [Month] datetime, [Repeat_Count] int, [Amount] int);
INSERT INTO @T ([Property], [Item], [Month], [Repeat_Count], [Amount]) VALUES
('A', 'Rent', '2016-01-01 00:00:00', 1, 100),
('A', 'Rent', '2016-02-01 00:00:00', 1, 105),
('A', 'Rent', '2016-03-01 00:00:00', 3, 110),
('A', 'Rent', '2016-06-01 00:00:00', 1, 115),
('A', 'Rent', '2016-07-01 00:00:00', 6, 120),
('A', 'Rent', '2017-01-01 00:00:00', 1, 125);
查询
SELECT *
FROM
@T AS T
CROSS APPLY
(
SELECT
DATEADD(day, dbo.Numbers.Number-1, T.Month) AS NewDate
FROM dbo.Numbers
WHERE dbo.Numbers.Number <= T.Repeat_Count
) AS CA
ORDER BY NewDate;
结果
+----------+------+-------------------------+--------------+--------+-------------------------+
| Property | Item | Month | Repeat_Count | Amount | NewDate |
+----------+------+-------------------------+--------------+--------+-------------------------+
| A | Rent | 2016-01-01 00:00:00.000 | 1 | 100 | 2016-01-01 00:00:00.000 |
| A | Rent | 2016-02-01 00:00:00.000 | 1 | 105 | 2016-02-01 00:00:00.000 |
| A | Rent | 2016-03-01 00:00:00.000 | 3 | 110 | 2016-03-01 00:00:00.000 |
| A | Rent | 2016-03-01 00:00:00.000 | 3 | 110 | 2016-03-02 00:00:00.000 |
| A | Rent | 2016-03-01 00:00:00.000 | 3 | 110 | 2016-03-03 00:00:00.000 |
| A | Rent | 2016-06-01 00:00:00.000 | 1 | 115 | 2016-06-01 00:00:00.000 |
| A | Rent | 2016-07-01 00:00:00.000 | 6 | 120 | 2016-07-01 00:00:00.000 |
| A | Rent | 2016-07-01 00:00:00.000 | 6 | 120 | 2016-07-02 00:00:00.000 |
| A | Rent | 2016-07-01 00:00:00.000 | 6 | 120 | 2016-07-03 00:00:00.000 |
| A | Rent | 2016-07-01 00:00:00.000 | 6 | 120 | 2016-07-04 00:00:00.000 |
| A | Rent | 2016-07-01 00:00:00.000 | 6 | 120 | 2016-07-05 00:00:00.000 |
| A | Rent | 2016-07-01 00:00:00.000 | 6 | 120 | 2016-07-06 00:00:00.000 |
| A | Rent | 2017-01-01 00:00:00.000 | 1 | 125 | 2017-01-01 00:00:00.000 |
+----------+------+-------------------------+--------------+--------+-------------------------+
关于sql - 如何向 "expand"当前有一个字段表示重复记录的表写入 sql 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36439133/