sql - 如何向 "expand"当前有一个字段表示重复记录的表写入 sql 查询?

标签 sql sql-server

我需要一个包含每个月记录的表,而不是具有重复计数字段的表。

我的数据目前如下所示:

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/

相关文章:

SQL 通过带索引的多列过滤

sql-server - SQL Server : Find records with closest Date to CurrentDate based on conditions

sql-server - 如何在 SQL 中分解具有相同子子名称的两个 xml 标签

java - 从数据库创建 JTable

sql - 如何在Sql Server 中获取最大值的多个字段?

java - 如何从一个表中获取另一表中不存在的行

SQL - SELECT MAX() 和伴随字段

sql-server - 在链接服务器上使用 PowerBI DirectQuery?

sql - 请问有人能解释为什么在SQL Server 2005中删除和重新创建存储过程会导致最初的速度下降比预期的要多得多吗?

sql - SSIS - 将 nchar 空字符串转换为 int 时出现表达式计算错误