我正在尝试执行一个返回购买帐单信息的查询,但是还有另一个包含帐单详细信息的表,但我需要将该总计添加到其他查询中,但我无法添加该列,因为它表示我需要在组中使用select中的相同对象,并且我尝试了这种方式,但它表示它返回多个值。请帮忙! :d
SELECT fc.fecha_factura_compra AS fecha, fc.id_factura AS no_factura, fc.serie,
o.abreviatura + CAST(p.corr_id AS VARCHAR(255)) AS codigo_trupp,
p.nombre, fc.dias_credito, fc.tipo_cambio,
(SELECT SUM(dc.peso_neto * dc.precio_unitario)
FROM detalle_compra AS dc
GROUP BY dc.id_proveedor,
dc.id_factura,
dc.serie) AS total
FROM factura_compra AS fc,
origen AS o,
proveedor AS p,
detalle_compra AS dc
WHERE fc.id_proveedor = p.id_proveedor
AND dc.id_proveedor = p.id_proveedor
AND dc.id_factura = fc.id_factura
AND p.id_origen = o.id_origen
AND dc.serie = fc.serie
AND dc.id_factura = fc.id_factura
AND dc.id_proveedor = fc.id_proveedor
AND fc.activo_inactivo = 'true'
AND fc.anulada = 'false'
答案 0 :(得分:8)
子查询的构造非常缓慢并且应该避免。更好的解决方案是编写如下的查询。
要向查询添加总计,您需要group by
覆盖结果集中的所有其他字段。
SELECT fc.fecha_factura_compra AS fecha
, fc.id_factura AS no_factura
, fc.serie
, o.abreviatura + CAST(p.corr_id AS VARCHAR(255)) AS codigo_trupp
, p.nombre
, fc.dias_credito
, fc.tipo_cambio
, SUM(dc.peso_neto * dc.precio_unitario) AS total
FROM factura_compra AS fc
JOIN proveedor AS p
ON fc.id_proveedor = p.id_proveedor
JOIN origen AS o
ON p.id_origen = o.id_origen
JOIN detalle_compra AS dc
ON dc.id_factura = fc.id_factura
AND dc.serie = fc.serie
AND dc.id_factura = fc.id_factura
AND dc.id_proveedor = fc.id_proveedor
AND dc.id_proveedor = p.id_proveedor
WHERE fc.activo_inactivo = 'true'
AND fc.anulada = 'false'
GROUP BY fc.fecha_factura_compra
, fc.id_factura
, fc.serie
, o.abreviatura + CAST(p.corr_id AS VARCHAR(255))
, p.nombre
, fc.dias_credito
, fc.tipo_cambio
答案 1 :(得分:6)
不应按列进行分组,而应限制连接列上的子选择,并从外部选择中省略detalle_compra
:
SELECT fc.fecha_factura_compra as fecha,
fc.id_factura as no_factura,
fc.serie,
o.abreviatura+CAST(p.corr_id as varchar(255)) as Codigo_Trupp,
p.nombre,
fc.dias_credito,
fc.tipo_cambio,
(select sum(peso_neto*precio_unitario)
from detalle_compra
where serie = fc.serie and
id_factura = fc.id_factura and
id_proveedor = fc.id_proveedor) as Total
FROM factura_compra as fc,origen as o, proveedor as p
WHERE fc.id_proveedor = p.id_proveedor and
p.id_origen = o.id_origen and
fc.activo_inactivo = 'true' and
fc.anulada = 'false'
旁注:使用BIT类型存储布尔值:
...
fc.activo_inactivo = 1 and
fc.anulada = 0