在记录集中添加缺少的月份

时间:2017-09-27 00:06:08

标签: sql-server

您能否按照以下要求帮助我生成结果?

我已经生成了一个结果集但是在我的数据中几个月没有数据因此,因此,记录集中没有显示月份,但我希望显示没有数据的所有月份。

请参阅附图,我也附上了结果脚本,可以轻松搞定。

{{3}}

Create Table #TempTbl(
    [Year]    int,
    [Month]   int,
    LostQty   int,
    WonQty    int,
    LostValue int,
    WonValue  int,
)

GO

INSERT INTO #TempTbl VALUES (2015, 3, 13, 6, 3000,4500),
                            (2015,  4,  1,  1,  4000, 200),
                            (2015,  5,  0,  1,  0,  200),
                            (2015,  6,  4,  6,  5000,   3000),
                            (2015,  7,  1,  2,  3500,   1100),
                            (2015,  8,  1,  1,  2000,   900),
                            (2015,  9,  5,  0,  2500,   0),
                            (2015,  10, 6,  3,  4500,   800),
                            (2015,  11, 0,  1,  0,  7400),
                            (2015,  12, 1,  0,  2200,   0),
                            (2016,  1,  3,  5,  2200,   200),
                            (2016,  2,  0,  1,  0,  1500),
                            (2016,  3,  1,  0,  2300,   0),
                            (2016,  4,  1,  0,  3500,   0),
                            (2016,  9,  4,  1,  1500,   1400),
                            (2016,  10, 16, 4,  1700,   3000),
                            (2016,  11, 5,  5,  500,    400),
                            (2016,  12, 6,  0,  600,    0)

1 个答案:

答案 0 :(得分:0)

正如评论中所提到的,永久日历表对于许多不同的任务非常有用,但有时添加新对象根本不可行。在那种情况下,动态构建一个很容易。

注意......在这个解决方案中,我使用基表来查询年份,但这样做是不必要的(甚至是不可取的)......只需记住一些事情...... < / p>

WITH 
    cte_Calendar AS (
        SELECT DISTINCT
            tt.[year],
            m.[Month]
        FROM
            #TempTbl tt
            CROSS APPLY ( VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12) ) m ([Month])
        )
SELECT 
    c.[Year], c.[Month], tt.LostQty, tt.WonQty, tt.LostValue, tt.WonValue
FROM
    #TempTbl tt
    FULL JOIN cte_Calendar c
        ON tt.[Year] = c.[Year]
        AND tt.[Month] = c.[Month]
ORDER BY 
    c.[Year],
    c.[Month];

结果......

Year        Month       LostQty     WonQty      LostValue   WonValue
----------- ----------- ----------- ----------- ----------- -----------
2015        1           NULL        NULL        NULL        NULL
2015        2           NULL        NULL        NULL        NULL
2015        3           13          6           3000        4500
2015        3           13          6           3000        4500
2015        4           1           1           4000        200
2015        4           1           1           4000        200
2015        5           0           1           0           200
2015        5           0           1           0           200
2015        6           4           6           5000        3000
2015        6           4           6           5000        3000
2015        7           1           2           3500        1100
2015        7           1           2           3500        1100
2015        8           1           1           2000        900
2015        8           1           1           2000        900
2015        9           5           0           2500        0
2015        9           5           0           2500        0
2015        10          6           3           4500        800
2015        10          6           3           4500        800
2015        11          0           1           0           7400
2015        11          0           1           0           7400
2015        12          1           0           2200        0
2015        12          1           0           2200        0
2016        1           3           5           2200        200
2016        1           3           5           2200        200
2016        2           0           1           0           1500
2016        2           0           1           0           1500
2016        3           1           0           2300        0
2016        3           1           0           2300        0
2016        4           1           0           3500        0
2016        4           1           0           3500        0
2016        5           NULL        NULL        NULL        NULL
2016        6           NULL        NULL        NULL        NULL
2016        7           NULL        NULL        NULL        NULL
2016        8           NULL        NULL        NULL        NULL
2016        9           4           1           1500        1400
2016        9           4           1           1500        1400
2016        10          16          4           1700        3000
2016        10          16          4           1700        3000
2016        11          5           5           500         400
2016        11          5           5           500         400
2016        12          6           0           600         0
2016        12          6           0           600         0