0

改写我的原始帖子以进一步澄清。

我目前有下表:

产品_参考

  • product_id
  • 产品名称

产品

  • product_id
  • so_date(日期)
  • 总销售额

日历

  • dt(日期字段,每一行代表过去/未来 10 年的一天)

我希望生成一份报告,该报告将告诉我过去 6 个月(基于 SYSDATE)每天销售的产品数量,该报告应该是过去 6 个月中每个可能的 product_id 的每一天组合格式:

产品编号 | 日期 | 总销售额

如果我假设产品表中有 0 个条目(即没有销售),我仍然希望得到完整的报告输出,但它会显示 6 个月的零数据,即

1 | 2012-01-01 | 0
2 | 2012-01-01 | 0
3 | 2012-01-01 | 0
1 | 2012-01-02 | 0
2 | 2012-01-02 | 0
3 | 2012-01-02 | 0
…

这将假设 product_reference 表中有 3 种产品 - 我的原始查询(如下所述)是我的 10 种产品,但不确定从这里去哪里。

SELECT products.product_id, calendar.dt, products.total_sales
FROM products RIGHT JOIN calendar ON (products.so_date = calendar.dt)
WHERE calendar.dt < SYSDATE AND calendar.dt >= ADD_MONTHS(SYSDATE, -7)+1
ORDER BY calendar.dt ASC, products.product_id DESC;
4

3 回答 3

1

线索就在问题中 - 您正在寻找一个 CROSS JOIN。

SELECT products.product_id, calendar.dt, products.total_sales
FROM Product_Ref
CROSS JOIN calendar 
LEFT JOIN products ON products.so_date = calendar.dt 
                    AND products.product_id = Product_Ref.product_id
WHERE calendar.dt < SYSDATE AND calendar.dt >= ADD_MONTHS(SYSDATE, -7)+1
ORDER BY calendar.dt ASC, products.product_id DESC;

起初我对您的表名感到困惑,其中“产品”实际上意味着“销售”,而“Product_Ref”是产品!

这与我曾经在此处发布的使用 CROSS JOIN 的示例非常相似。

于 2013-01-16T17:13:05.117 回答
0

假设您想要的输出是仅将产品日期与日历表中的日期匹配,您应该使用INNER JOIN

SELECT c.dt, p.product_id, p.total_sales
FROM calendar c
INNER JOIN products p on c.dt = p.so_date
WHERE c.dt < SYSDATE and c.dt >= ADD_MONTHS(SYSDATE,-7)+1
ORDER BY c.dt ASC, p.product_id DESC;

ACROSS JOIN将使用您的产品表和日历表中的每个组合产生结果,因此不需要使用ON.

- 编辑

请参阅下面的编辑(未经测试):

SELECT PR.Product_ID, C.dt, P.TotalSales
FROM Calendar C 
   CROSS JOIN Product_Ref PR 
   LEFT JOIN Product P ON P.Product_Id = PR.Product_Id and p.so_date = c.dt
WHERE c.dt < SYSDATE and c.dt >= ADD_MONTHS(SYSDATE,-7)+1
ORDER BY c.dt ASC, p.product_id DESC;

祝你好运。

于 2013-01-16T16:23:21.860 回答
0

据我了解,如果没有销售,您想要的是没有结果,写?

所以,我认为你只需要将RIGHT JOIN更改为INNER JOIN

通过 RIGHT 连接,如果 JOIN 表中有寄存器,而 FROM 表中没有,它将返回 JOIN 表中的数据,引用 FROM 表的列中的值为 NULL。

通过 INNER 加入,只要您在两个表中都有匹配的数据,您就会得到结果。

希望我理解得很好,它会有所帮助。

于 2013-01-16T16:25:35.883 回答