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
;
我有两个 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
;