如何从数据库中获取信息,不包括某些数据

时间:2017-06-29 14:01:30

标签: sql sql-server

我的数据库中有3个表。

第一个表是“Ordenes”,在此表中我拥有用户在网站中创建的所有订单,此表获得的信息包括:FechaFinal,FechaInicial,NoOrden,Cantidad和Estado。

我有另一个名为“Cables”的表,在此表中我保存了用户每个订单注册的所有电缆。

例如,如果我有一个订单行且Cantidad说这是200,那么用户需要在此订单中注册200条电缆。

Cables表包含以下信息:Serial,IdOrden和IdOperation。 IdOperation是Operations Tables的外键,在此表中我保存了以下信息:操作名称及其全部。

所以我想做一个向我展示这个信息的SQL查询:

FechaInicial(来自订单表),Fechafinal(来自订单表),NoOrden(来自订单表),材料(来自订单表),Cantidad(来自订单表)和Performed(这是我所有电缆的数量)在我的电缆表中有一些订单)

我拥有它,并且它可以工作,但我希望查询只能计算一些名为“Scrap”的操作中没有的电缆。

我有这个SQL查询,它可以工作,但它也在计算'Scrap'操作中的电缆。

SELECT o.FechaInicial, o.FechaFinal, o.NoOrden, o.Material, o.Cantidad, COUNT(c.IdCable) as 'Hechos', o.Estado
FROM Ordenes o
LEFT JOIN Cables c ON o.IdOrden = c.IdOrden 
LEFT JOIN Operaciones op ON c.IdOperacion = op.IdOperacion AND op.Nombre NOT IN ('Scrap')
GROUP BY o.FechaInicial, o.Fechafinal, o.NoOrden, o.Material, o.Cantidad, o.Estado;

我想显示所有订单,即使订单还没有电缆。

2 个答案:

答案 0 :(得分:1)

如果COUNT(op.Nombre)可以为NULL,则将计数更改为COUNT(op.idOperacion)Nombre

答案 1 :(得分:0)

left join会保留所有行,即使是scrap行。最佳解决方案是计算最后一个表中的主键或连接键。所以,我建议:

SELECT o.FechaInicial, o.FechaFinal, o.NoOrden, o.Material, o.Cantidad, 
       COUNT(op.IdOperacion) as Hecho, o.Estado
FROM Ordenes o LEFT JOIN 
     Cables c
     ON o.IdOrden = c.IdOrden LEFT JOIN
     Operaciones op
     ON c.IdOperacion = op.IdOperacion AND op.Nombre NOT IN ('Scrap')
GROUP BY o.FechaInicial, o.Fechafinal, o.NoOrden, o.Material, o.Cantidad, o.Estado;

这只计算Operaciones中的“匹配”行。

注意:如果计算数据列,则可能会丢失原始表中该值为NULL的行。这可能是一件好事,具体取决于查询的意图。通常,在匹配发生时计算不能为NULL的内容会更安全。