将SUM列添加到查询中

时间:2010-07-13 07:17:54

标签: sql sql-server

我正在尝试执行一个返回购买帐单信息的查询,但是还有另一个包含帐单详细信息的表,但我需要将该总计添加到其他查询中,但我无法添加该列,因为它表示我需要在组中使用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'

2 个答案:

答案 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