es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo filtrar datos en SQL sin utilizar funciones de Group By / Having.

Tengo una situación en la que intento producir una consulta que muestre el número de artículo en una orden de venta y la cantidad total pendiente en todas las órdenes. Puedo hacerlo de la siguiente manera:

SELECT
SL.[Item No_],
SUM(SL.[Outstanding Quantity])

FROM [Database$Sales Header] SH
LEFT JOIN [Database$Sales Line] SL ON SL.[Document No_] = SH.[No_]
LEFT JOIN [Database$Items] I ON I.[No_] = SL.[Item No_]

GROUP BY
SL.[Item No_],
SH.[Document Type],
I.[Product Code]

HAVING
SH.[Document Type] = ‘1’
Y I.[Product Code] = ‘SHIRT’;

ORDER BY
SL.[Item No_]

El código anterior me da un resumen simple del número de artículo y la cantidad en todas las órdenes de venta. Estoy usando la cláusula HAVING para incluir sólo órdenes de venta (Tipo de documento) y sólo artículos que son camisas (Código de producto).

El problema que tengo es cuando quiero excluir a un cliente en particular.

Intenté agregar: AND SH.[Customer No_] <> ‘CUST1’ a la cláusula HAVING pero si lo hago, entonces SQL me pedirá que lo agregue en la cláusula GROUP BY. El resultado es que obtengo filas duplicadas donde se resumió antes porque ahora SQL informa sobre la cantidad pendiente por número de artículo y número de cliente, lo cual no es lo que quiero.

Así que no estoy seguro de cómo excluir a ese cliente sin ponerlo en GROUP BY.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una solución para excluir a un cliente en particular sin agregarlo a la cláusula GROUP BY es utilizar una subconsulta.

    En primer lugar, cree una subconsulta que seleccione todos los números de documento para el cliente que desea excluir:

    SELECT [No_]
    FROM [Database$Sales Header]
    WHERE [Customer No_] = 'CUST1'
    

    Luego, use esta subconsulta en la consulta principal para filtrar todas las órdenes de venta realizadas por ese cliente:

    SELECT
    SL.[Item No_],
    SUM(SL.[Outstanding Quantity])
    
    FROM [Database$Sales Header] SH
    LEFT JOIN [Database$Sales Line] SL ON SL.[Document No_] = SH.[No_]
    LEFT JOIN [Database$Items] I ON I.[No_] = SL.[Item No_]
    
    WHERE SH.[Document Type] = '1'
    AND I.[Product Code] = 'SHIRT'
    AND SH.[No_] NOT IN (
    SELECT [No_]
    FROM [Database$Sales Header]
    WHERE [Customer No_] = 'CUST1'
    )
    
    GROUP BY
    SL.[Item No_],
    I.[Product Code]
    
    ORDER BY
    SL.[Item No_]
    

    Esto excluye todas las órdenes de venta realizadas por el cliente ‘CUST1’ sin afectar el agrupamiento original por número de artículo y cantidad pendiente.

Comments are closed.