SQL - 总结每月销售数据

SQL - Summarizing Monthly Sales Data

我有两个 table 需要合并,但我似乎无法让连接起作用。图片有三个tables

_date_array2:有一个字段 DateMonthYr 包含所有可能的 date/yr 组合

_sales_summ_tbl__ => 有 5 个字段。只有几个月的销售出现。例如,对于第二个 table,您只看到三个记录。例如,没有 5/2016,因为该月没有销售。

我的目标是 "pad" 第二个 table 在没有销售的几个月内总需求为 0。我非常接近(参见第三个 table),只是我无法让 PartNumber 显示没有销售的日期。

我的猜测是由于 RIGHT JOIN。但我不确定如何处理。 我希望的输出是 table 3,但所有条目都填充了部件号。

这是我的代码(运行这段代码的结果是图片中的third/lasttable):

SELECT TmpSalesTbl.PartNumber as PartNumber,
tmp_date_array.CreateDateMonth as CreateDateMonth,
tmp_date_array.CreateDateYear as CreateDateYear,
CASE WHEN TmpSalesTbl.TotalDemand is NULL THEN 0 ELSE TmpSalesTbl.TotalDemand END as TotalDemand
FROM #_sales_summ_tbl__ TmpSalesTbl
RIGHT JOIN #_date_array2 tmp_date_array on tmp_date_array.CreateDateMonthYr = TmpSalesTbl.CreateDateMonthYr
ORDER BY tmp_date_array.CreateDateYear, tmp_date_array.CreateDateMonth

更传统的做法是首先放置所有日期的列表,然后左连接到数据,虽然使用 case 表达式很好,但替代方法是 coalesce()。这应该确保所有想要的 months/years 显示:

SELECT
      tmpsalestbl.PartNumber               AS partnumber
    , tmp_date_array.CreateDateMonth       AS createdatemonth
    , tmp_date_array.CreateDateYear        AS createdateyear
    , COALESCE(tmpsalestbl.TotalDemand, 0) AS totaldemand
FROM #_date_array2 tmp_date_array
LEFT JOIN #_sales_summ_tbl__ tmpsalestbl ON tmp_date_array.CreateDateMonthYr = tmpsalestbl.CreateDateMonthYr
ORDER BY
      tmp_date_array.CreateDateYear
    , tmp_date_array.CreateDateMonth

要填充每个零件号,每个月您都需要一个新的子查询:

select distinct PartNumber #_sales_summ_tbl__

然后 cross join 到 years/months 所以你有一套完整的 years/months/部分。

SELECT
      cj.PartNumber                        AS partnumber
    , tmp_date_array.CreateDateMonth       AS createdatemonth
    , tmp_date_array.CreateDateYear        AS createdateyear
    , COALESCE(tmpsalestbl.TotalDemand, 0) AS totaldemand
FROM #_date_array2 tmp_date_array
CROSS JOIN (
      SELECT DISTINCT
            PartNumber FROM #_sales_summ_tbl__
      ) cj
LEFT JOIN #_sales_summ_tbl__ tmpsalestbl ON tmp_date_array.CreateDateMonthYr = tmpsalestbl.CreateDateMonthYr
                                        AND cj.PartNumber = tmpsalestbl.PartNumber
ORDER BY
      tmp_date_array.CreateDateYear
    , tmp_date_array.CreateDateMonth
;