使用 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 BY
。 GROUP BY
应该包含来自SELECT
的普通列。
您的列 a.IdFactura
和 b.Descuento_Cliente
不在聚合函数内,因此您应该将它们包含在 GROUP BY
中。较旧的 MySQL 版本默认允许这样做,您可能会看到可变的结果(与括号无关)。
要查看查询是否正确,您可以显示一些示例代码和所需的结果。
【讨论】:
以上是关于使用 LEFT JOIN 的 MySQL 视图中的问题... GROUP BY的主要内容,如果未能解决你的问题,请参考以下文章
关于mysql中的left join和left outer join的区别
MySQL中的LEFT JOIN 和UNIONALL的联合使用