SQL使用条件保留连接查询

时间:2012-06-25 17:00:29

标签: sql-server left-join

我的程序中有两个表来管理库存:

  

Articulos(项目):

     

id_articulo(id_item),nombre(name),tipo(kind)

     

Salidas(发货):

     

id_articulo(id_item),cant_sale(发货金额),imp_total(总计)   成本),almacen_destino(shipemt stock destiny),日期

我被要求做一个静态的产品清单,所以他们总是会以相同的顺序显示相同的项目,其中项目类型(tipo)=某事

当我想在日期之间搜索特定的货物库存desiny(almacen_destino)时,我无法获得所有相同类型的物品(tipo),因为它们没有发货

这是我到目前为止的查询:

select a.id_articulo, sum(s.cant_sale) as Cant_sale, sum(s.imp_total) as Imp_total
from articulos a left join salidas s
on a.id_articulo=s.id_articulo
WHERE a.tipo='EMPAQUES'
and FECHA BETWEEN '06/06/2012' AND '12/06/2012'
and s.almacen_destino like 'CERRO COLORADO'
group by a.id_articulo

它只显示该股票的发货项目,其中tipo(kind)=这些日期之间的Empaques,不好显示相同的信息加上所有其他相同类型的商品(tipo),即使发货也没有发货金额和总费用为空。

提前,谢谢。

2 个答案:

答案 0 :(得分:3)

在外部表上放置过滤条件会将外部联接转换为内部联接。你试过了吗?

SELECT 
  a.id_articulo, 
  SUM(s.cant_sale) AS Cant_sale, 
  SUM(s.imp_total) AS Imp_total
FROM
  dbo.articulos AS a 
LEFT OUTER JOIN
  dbo.salidas AS s
  ON a.id_articulo = s.id_articulo
  AND s.almacen_destino = 'CERRO COLORADO'
  AND s.FECHA BETWEEN '20120606' AND '20120612'
WHERE a.tipo = 'EMPAQUES'
GROUP BY a.id_articulo;

我在这里猜到了一些事情:

  • FECHAsalidas中 - 如果没有,则将该AND移至WHERE子句。
  • 您的日期是d / m / y。请始终使用明确的日期格式 - 您可能位于英国或加拿大,但不是所有观众都是,而且我们无法理解您的想法。

答案 1 :(得分:1)

您必须在WHERE子句中包含必须使用LEFT JOIN ed表的任何ON子句块。