在多行中拆分同一列的日期,直到指定下一个日期值 - SQL Server

时间:2017-07-06 14:21:10

标签: sql sql-server

我有这张桌子

+------+------------+-----+
| Code |    date    | qty |
+------+------------+-----+
|    1 | 06-07-2017 |  44 |
|    1 | 08-07-2017 |  45 |
|    2 | 07-07-2017 |  32 |
|    2 | 09-07-2017 |  33 |
+------+------------+-----+

我希望以这种方式显示

+------+------------+-----+
| Code |    date    | qty |
+------+------------+-----+
|    1 | 06-07-2017 |  44 |
|    1 | 07-07-2017 |  44 |
|    1 | 08-07-2017 |  45 |
|    2 | 07-07-2017 |  32 |
|    2 | 08-07-2017 |  32 |
|    2 | 09-07-2017 |  33 |
+------+------------+-----+

我想将相同'代码'的日期分开。为' qty'保持相同的价值直到下一个相同的代码'。

1 个答案:

答案 0 :(得分:0)

您需要日历表和Outer Apply

;WITH cte 
     AS (SELECT Min([date]) AS st, 
                Max([date]) ed, 
                code 
         FROM   Yourtable 
         GROUP  BY code 
         UNION ALL 
         SELECT Dateadd(dd, 1, st) AS st, 
                ed, 
                code 
         FROM   cte 
         WHERE  Dateadd(dd, 1, st) <= ed) 
SELECT c.code, 
       [date]=c.st, 
       qty 
FROM   cte c 
       OUTER apply (SELECT TOP 1 qty 
                    FROM   Yourtable a 
                    WHERE  a.code = c.code 
                           AND c.st >= a.[date] 
                    ORDER  BY [date] DESC) oa 
ORDER  BY c.code,st 

注意:为了完整起见,我使用Recursive CTE生成日期,您始终可以在数据库中创建物理日历表并使用它。