2017-09-27 90 views
0

您能帮我按照以下要求生成结果吗?在记录集中添加缺失的月份

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

请参阅附加的图像,我也附上了结果脚本,以便在此上轻松工作。

enter image description here

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) 
+2

只需添加一个日历表,填充它,并留下你的表加入。使用ifnull(值,0) – Horaciux

+0

感谢Horaciux现在的工作 – Nadeem

+0

我很高兴它有帮助,我在电话中,很难从那里编码。 – Horaciux

回答

0

正如在评论中提到,永久日历表是许多不同的任务非常有帮助的,但有些时候添加新对象时,根本是不可行的。在这种情况下,在飞行中很容易建立一个。

注意...在这个解决方案中,我使用基表来查询年份,但这样做并不是必需的(或者甚至是不可取的)...只是要记住......

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 
+0

没问题。很高兴我能帮上忙。 :) –