我有两个需要组合的表,但我不能让它们看起来像要工作的联接。这幅画有三张桌子
_date_array2:有一个字段DateMonthYr,其中包含所有可能的日期/年组合
_sales_summ_tbl__ =>有5个字段。只有几个月的销售出现。例如,您只看到第二个表显示了三个记录。例如,没有2016年5月,因为那个月没有销售。
我的目标是“垫”第二个表,使TotalDemand在几个月内没有销售。我非常接近(见第三表),但我无法让PartNumber在没有销售的情况下出现。
我猜是因为正确的加入。但我不知道该怎么处理。,我希望的输出是表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发布于 2017-11-30 01:28:28
更传统的做法是将所有日期的列表放在第一位,然后离开对数据的联接,同时使用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要在每个月中填充每个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
;https://stackoverflow.com/questions/47564078
复制相似问题