我需要将两个表组合起来,但我无法看到联接起作用。图片有三个表
_date_array2:有一个字段DateMonthYr,其中包含所有可能的日期/年份组合
_sales_summ_tbl__ =>有5个领域。只有几个月的销售出现。例如,您只看到显示第二个表的三个记录。例如,没有5/2016,因为那个月没有销售。
我的目标是在没有销售的情况下“填充”第二个表,使TotalDemand为0个月。我非常接近(见第三张表),除了我无法让PartNumber显示没有销售的日期。
我的猜测是,这是由于RIGHT JOIN。但我不知道如何处理这个问题。 我希望的输出是表3,但是为所有条目填充了部件号。
这是我的代码(运行此代码的结果是图片中的第三个/最后一个表):
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
答案 0 :(得分:1)
更常规的是,首先放置所有日期的列表,然后将左边连接放到数据中,而使用case表达式则很好,另一种选择是coalesce()
。这应该确保所有想要的月/年显示:
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
要填写evey partnumber,每个月都需要一个新的子查询:
select distinct PartNumber #_sales_summ_tbl__
然后cross join
那个年/月,所以你有一套完整的年/月/部分。
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
;