【问题标题】:New to MySQL and having issue with joining 3 tables with roll up by MonthMySQL 新手,在加入 3 个按月汇总的表时遇到问题
【发布时间】:2019-12-07 13:28:28
【问题描述】:

我试图在一个视图中显示我的销售额、客户退货和利润。

我已按月在 2 个表中成功完成了内部联接,并按月成功创建了视图。但是,对于 3 个表,我在 date 或 customerorders 表上出现错误(在使用代码时会发生错误)。由于 ProductID 是所有 3 列的公共列,因此我已将其放入 ON 和 WHERE 部分。

我已经根据教程(我正在独立学习 MySQL 工作台)和研究来玩弄代码。看起来下面的代码应该可以工作。我不知道出了什么问题。请注意,我尝试进行两个内部连接,但也没有成功,例如

INNER JOIN supplierstockorder ON customerorders.ProductID = supplierstockorder.ProductID = customerreturns.ProductID 
INNER JOIN customerreturns ON customerorders.ProductID = customerreturns.ProductID

谁能帮忙?

Table 1 - customerorders(CustomerOrderID varchar(255) PK, 

日期日期, 客户 ID varchar(255), PaymentID varchar(255), 产品ID varchar(255), 数量 int(20), OrderValue 十进制 (18, 2) 表 2 - customerreturns(ReturnID varchar(255) PK, 客户 ID varchar(255), 日期日期, 产品ID varchar(255), CRQuantity int(10), 返回值 int(10)) 表 3-supplierstockorder(SupplierStockOrderID varchar(255) PK, 日期日期, 供应商 ID varchar(255), 产品ID varchar(255), 数量 int(10), 成本价格 int(10), 增值税小数(10,2), SSTotal int(10))

CREATE VIEW SalesProfitCrReturns AS
SELECT monthname(Date) as MonthDetails, SUM(customerorders.OrderValue) AS Sales, 
SUM(customerreturns.ReturnsValue) AS CustomerReturns, 
SUM(supplierstockorder.Quantity * supplierstockorder.CostPrice) 
- SUM(customerorders.OrderValue) 
- SUM(customerreturns.ReturnsValue) AS Profit
FROM customerorders, customerreturns
INNER JOIN supplierstockorder
ON customerorders.ProductID = supplierstockorder.ProductID = customerreturns.ProductID
WHERE customerorders.ProductID = supplierstockorder.ProductID = customerreturns.ProductID
GROUP BY MonthDetails with rollup;

【问题讨论】:

    标签: mysql


    【解决方案1】:

    以下是有效查询的示例。如需更多帮助,请参阅Why should I provide an MCRE for what seems to me to be a very simple SQL query

    SELECT monthname(Date) MonthDetails
         , SUM(o.OrderValue) Sales
         , SUM(r.ReturnsValue) CustomerReturns
         , SUM(s.Quantity * s.CostPrice) - SUM(o.OrderValue) - SUM(r.ReturnsValue) Profit
      FROM customerorders o
      JOIN customerreturns r
        ON r.ProductID = o.ProductID 
      JOIN supplierstockorder s
        ON s.ProductID = o.ProductID
     GROUP 
        BY MonthDetails 
      WITH ROLLUP;
    

    请注意,这会选择所有年份的月份数据,这是一个奇怪的请求

    【讨论】:

    • 感谢您的链接。我已经编辑了表格列表,其中的列指示列设置为什么类型。
    • 链接所暗示的并不完全(或只是部分)
    • 我也试过你的代码,但它不工作。说日期模棱两可。我只有今年的数据,因为这就是我做生意的全部目的。
    • 消除歧义。如果日期属于customerorders,则为o.date。也就是说,如果错误存在于我的查询中,那么它也存在于您的查询中,对吧?
    • 搞定了,谢谢。我会更详细地阅读链接,我已经查看了前三名以匆忙更改。将确保我将来提出的任何查询都反映了该链接。感谢您的帮助,非常感谢。
    【解决方案2】:

    INNER JOIN supplystockorder ON customerorders.ProductID = supplierstockorder.ProductID = customerreturns.ProductID INNER JOIN customerreturns ON customerorders.ProductID = customerreturns.ProductID

    有太多 = 比较 只用 customerorders.ProductID = 供应商库存订单.ProductID

    并仅在其他加入条件下比较 customerreturns.ProductID

    简而言之,删除 = customerreturns.ProductID 从第一个条件开始

    【讨论】:

      【解决方案3】:
      FROM customerorders, customerreturns
      INNER JOIN supplierstockorder
          ON customerorders.ProductID = supplierstockorder.ProductID = customerreturns.ProductID
      WHERE customerorders.ProductID = supplierstockorder.ProductID = customerreturns.ProductID
      

      您似乎在 FROM 子句中混合了显式和隐式连接。此外,WHERE 和 ON 连接部分中的条件不是有效的 SQL。相等条件涉及两列,而不是三列(因此您应该有两个相等条件)。

      应该这样写:

      FROM customerorders
      INNER JOIN customerreturns
          ON customerreturns.ProductID = customerorders.ProductID
      INNER JOIN supplierstockorder
          ON supplierstockorder.ProductID = customerreturns.ProductID
      -- no WHERE clause needed
      

      最后,从您的表结构来看,我倾向于认为customerorders 和customerreturns 之间的连接应该涉及CustomerID:

      FROM customerorders
      INNER JOIN customerreturns
          ON  customerreturns.ProductID = customerorders.ProductID
          AND customerreturns.CustomerID = customerorders.CustomerID
      INNER JOIN supplierstockorder
          ON supplierstockorder.ProductID = customerreturns.ProductID
      -- no WHERE clause needed
      

      【讨论】:

      • 谢谢。就这样我理解正确,我不需要带有 3 个表的 where 子句,我可以有超过 1 组连接表的相应外键。所以如果我想做4个表,我会按照上面的格式等等?
      • 我已经编辑并运行了代码,我收到“错误 1052:字段列表中的 COlumn 'Date' 不明确。”我以前的日期有问题。我已将所有表的日期列设置为 varchar(255) 并将所有列的日期列设置为,但均无效。
      • @cmdublin:您的查询涉及的多个表中有一个名为 Date 的列。您需要对Date 列进行限定,即为其所属的表添加前缀(例如:ècustomerorders.Date,或customerreturns.date,或其他)。
      • 非常感谢。我取自之前在一张表中使用过的代码。我想它现在已经奏效了。数学似乎略有偏差,但我可以对照我的 Excel 表仔细检查我的数字。
      猜你喜欢
      • 2012-08-15
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多