我的数据库中有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;
我想显示所有订单,即使订单还没有电缆。
答案 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
的内容会更安全。