使用 LEFT JOIN 的 MySQL 视图中的问题... GROUP BY

Posted

技术标签:

【中文标题】使用 LEFT JOIN 的 MySQL 视图中的问题... GROUP BY【英文标题】:Problem in MySQL View with LEFT JOIN... GROUP BY 【发布时间】:2020-03-28 17:58:59 【问题描述】:

我在 mysql 中有这样的查询:

SELECT
a.IdFactura,
(sum((a.Precio_sinIVA*a.Cantidad)-(a.Descuento/(1+a.IVA_Tipo)))) AS SUM,
(1-((b.Descuento_Cliente * 1.0)/100.00)) As DESCUENT,
(sum((a.Precio_sinIVA*a.Cantidad)-(a.Descuento/(1+a.IVA_Tipo)))) * (1-((b.Descuento_Cliente * 1.0)/100.00)) As Base_Imponible
FROM Lineas_Facturas a
LEFT JOIN Facturas b ON a.IdFactura = b.IdFactura
GROUP BY a.IdFactura

查询返回,例如:

a.IdFactura   SUM    DESCUENT   Base_Imponible
655           29.75  0.9        26.77 (OK)

但是当我将此查询包含到 VIEW 中并运行它时,VIEW 返回,例如:

a.IdFactura   SUM    DESCUENT   Base_Imponible
655           29.75  0.9        29.65 (WRONG)

我只想将 SUM * DESCUENT 相乘,在查询中结果还可以,但是当我将它包含到 VIEW 中时,结果就不同了。

问题出在哪里?有人可以帮帮我吗?

更新:

我仔细查看了 MySQL 视图和 SQL 查询,当我保存视图时,查询的括号发生了变化,一些被删除了。视图中保存的查询是这样的:

SELECT
a.IdFactura,
sum(a.Precio_sinIVA*a.Cantidad-a.Descuento/(1+a.IVA_Tipo)) AS SUM,
1-b.Descuento_Cliente * 1.0/100.00 As DESCUENT,
sum(a.Precio_sinIVA*a.Cantidad-a.Descuento/(1+a.IVA_Tipo)) * 1-b.Descuento_Cliente * 1.0/100.00 As Base_Imponible
FROM Lineas_Facturas a
LEFT JOIN Facturas b ON a.IdFactura = b.IdFactura
GROUP BY a.IdFactura

我已经查看了查询代码,并且可以不用DESCUENT字段中的所有括号,除了2(括号在字段的开头和结尾):

(1-b.Descuento_Cliente * 1.0/100.00) As DESCUENT,

没有这两个括号,'Base_Imponible' 字段中的所有计算都是不正确的。有什么想法吗?。

【问题讨论】:

您是否检查了视图的 DDL 以查看它是否与此查询匹配? 是的,它与查询匹配 【参考方案1】:

我已经使用 CTE 解决了这个问题。 SQL 视图是:

WITH cte AS (
SELECT 
    Lineas_Facturas.IdFactura AS IdFactura,
    (sum(Precio_sinIVA*Cantidad-Descuento/(1+IVA_Tipo))) AS SUMA, 
    (1-Facturas.Descuento_Cliente * 1.0/100.00) AS DISCOUNT 
from Lineas_Facturas
LEft Join Facturas ON Lineas_Facturas.IdFactura = Facturas.IdFactura
GROUP BY Lineas_Facturas.IdFactura
)
SELECT IdFactura, (SUMA*DISCOUNT) AS Base_Imponible
FROM cte

非常感谢。

沃迪亚姆

【讨论】:

【参考方案2】:

当您将普通列与聚合函数混合使用时,您必须使用GROUP BYGROUP BY 应该包含来自SELECT 的普通列。

您的列 a.IdFacturab.Descuento_Cliente 不在聚合函数内,因此您应该将它们包含在 GROUP BY 中。较旧的 MySQL 版本默认允许这样做,您可能会看到可变的结果(与括号无关)。

要查看查询是否正确,您可以显示一些示例代码和所需的结果。

【讨论】:

以上是关于使用 LEFT JOIN 的 MySQL 视图中的问题... GROUP BY的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 的 2 个字段上的 SQL LEFT-JOIN

关于mysql中的left join和left outer join的区别

使用 LEFT JOIN 更新 MySQL 中的多个表

MySQL中的LEFT JOIN 和UNIONALL的联合使用

Mysql之inner join,left join,right join详解

SQL Server 在视图查询中将 LEFT JOIN 替换为 LEFT OUTER JOIN