Muestra el valor en la columna aunque está excluido por una condición WHERE sobre otra columna

Aug 20 2020

DB-violín

CREATE TABLE operations (
    id int auto_increment primary key,
    orderID VARCHAR(255),
    itemID VARCHAR(255),
    event_date DATE,
    order_volume INT,
    shipped_volume INT
);

INSERT INTO operations
(itemID, orderID, event_date, order_volume, shipped_volume
)
VALUES 
("Item_01", "Order_XYZ", "2020-05-01", "600", "0"),
("Item_01", "Order_XYZ", "2020-05-18", "0", "315"),
("Item_01", "Order_XYZ", "2020-05-19", "0", "100"),
("Item_01", "Order_MTE", "2020-08-15", "400", "0"),
("Item_01", "Order_OBD", "2020-08-21", "500", "0"),
("Item_01", "Order_OBD", "2020-11-17", "0", "380"),

("Item_02", "Order_TLP", "2020-02-02", "500", "0"),
("Item_02", "Order_TLP", "2020-02-10", "0", "175"),
("Item_02", "Order_ADF", "2020-03-27", "100", "0"),

("Item_03", "Order_BBI", "2020-03-12", "700", "0"),

("Item_04", "Order_DXR", "2020-12-09", "260", "0"),
("Item_04", "Order_DXR", "2020-12-15", "0", "110"),
("Item_04", "Order_DXR", "2020-12-15", "0", "60"),
("Item_04", "Order_FGU", "2020-12-15", "0", "80");

Resultado Esperado:

    itemID    |    orderID    |      sum(order_volume)   |      sum(shipped_volume)  
--------------|---------------|--------------------------|---------------------------------------
    Item_04   |   Order_DXR   |            260           |             250
    Item_02   |   Order_TLP   |            500           |             175
    Item_01   |   Order_XYZ   |            600           |             415
    Item_01   |   Order_OBD   |            500           |             380

En el resultado anterior, quiero enumerar todos itemIDy orderIDque tienen shipped_volume > 0.
Por lo tanto, fui con esta consulta:

SELECT 
itemID,
orderID,
sum(order_volume),
sum(shipped_volume)
FROM operations
WHERE shipped_volume > 0
GROUP BY 1,2;

Me da casi el resultado que estoy buscando.
El único problema que tengo es que pone una 0para todas las filas en la columna sum(order_volume)que es causada por la WHEREcondición.

¿Qué debo cambiar para que también muestre el sum(order_volume)de todos itemsy ordersque tenga un shipped_volume > 0?

Respuestas

Gosfly Aug 20 2020 at 16:55

Esto puede ser lo que estás buscando si entendí bien:

SELECT 
  itemID,
  orderID,
  sum(order_volume),
  sum(shipped_volume)
FROM operations
GROUP BY 1,2
HAVING sum(shipped_volume) > 0;

ENCUENTRA UNA DEMO AQUÍ

1 ChrisSchaller Aug 20 2020 at 16:54

Simplemente nosotros HAVINGen lugar de dónde, este ejemplo es el ejemplo perfecto de cómo usar HAVING, ¡piense en ello como aplicar el filtro DESPUÉS de calcular los resultados del grupo!

SELECT 
  itemID,
  orderID,
  SUM(order_volume),
  SUM(shipped_volume)
FROM operations
GROUP BY itemID, orderID
HAVING SUM(shipped_volume) > 0;

Tu violín actualizado

Más lecturas HAVINGespecíficamente para MySQL:https://www.mysqltutorial.org/mysql-having.aspx

NOTA: En este ejemplo, he usado referencias de nombres de columnas explícitas en lugar de ordinales, hay muchos argumentos de apoyo para esto, voy con "es más expresivo y más difícil equivocarse".

  • Los ordinales en GROUP BYno son compatibles con todos los motores o versiones de db.
  • https://stackoverflow.com/a/45569726/1690217