none
SELECT SQL - BUSCAR 2 O MAS VALORES DE UNA MISMA COLUMNA RRS feed

  • Pregunta

  • Hola a todos,

    tengo el siguiente problema, tengo una tabla de ventas con una columna de productos tipo integer, en contexto, una sola venta puede tener varias filas con productos ejem:

    código_venta, código_producto,fecha_venta

    1                  1                      20180601

    1                  2                      20180601

    1                  3                      20180601

    2                  2                      20180601

    2                  3                      20180601

    a las ventas necesito aplicarle unas condiciones de consulta, en las que me piden que una venta (ejem: código_venta=1) tenga los productos 1,2,3 exactamente esos. el problema es que me traen otras ventas, teniendo en cuenta que:

    si utilizo el operador IN (1,2,3) me trae la venta 1 al igual que la venta 2 por que ambas tiene los productos 2 y 3 y no cumple con la condición que necesito.

    lo mismo sucede si utilizo el operador OR código_producto=1 or código_producto=2 or código_producto=3 me trae la venta 2 por que tiene algunos de esos productos y no cumple la condición.

    no se, que otra forma pueda utilizar para aplicar las condiciones que me pide, e intentando utilizar los productos en Split (1 solo registro y todos los productos en una sola fila separados por coma,

    código_venta, producto_split, fecha_venta

    1                    1,2,3               20180601

    2                    2,3                  20180601

    3                    3,1,2               20180601

    pasa que la condición (1,2,3) me trae la venta 1 pero no me trae la venta 3 que tiene los mismos productos en diferente orden, ya no se que puedo hacer para realizar esas condiciones que necesito aplicar, gracias a todos por la ayuda.


    Danny

    viernes, 29 de junio de 2018 0:51

Respuestas

  • Hola Danny Mosquera:

    Puedes contar el número de ocurrencias.

    create table ventas (codigo_Venta int, codigo_producto int, fecha_Venta date)
    go
    insert into ventas (codigo_Venta, codigo_producto, fecha_Venta) 
    values (1,1,'20180601'),(1,2,'20180601'),(1,3,'20180601'),(2,1,'20180601'),(2,2,'20180601'),(3,3,'20180601'),(3,1,'20180601'),(3,2,'20180601'),(4,1,'20180601'),(4,2,'20180601')
    go
    
    
    SELECT o.codigo_Venta
    FROM
    (
        SELECT codigo_Venta,
               codigo_producto
        FROM ventas
        WHERE codigo_producto in (1,2,3)    GROUP BY codigo_Venta,
                 codigo_producto
    ) AS o
    GROUP BY o.codigo_Venta
    HAVING COUNT(*) >= 3;
    
    
    
    
    Un saludo

    • Marcado como respuesta Danny Mosquera viernes, 29 de junio de 2018 17:14
    viernes, 29 de junio de 2018 5:35

Todas las respuestas

  • Hola Danny Mosquera:

    Puedes contar el número de ocurrencias.

    create table ventas (codigo_Venta int, codigo_producto int, fecha_Venta date)
    go
    insert into ventas (codigo_Venta, codigo_producto, fecha_Venta) 
    values (1,1,'20180601'),(1,2,'20180601'),(1,3,'20180601'),(2,1,'20180601'),(2,2,'20180601'),(3,3,'20180601'),(3,1,'20180601'),(3,2,'20180601'),(4,1,'20180601'),(4,2,'20180601')
    go
    
    
    SELECT o.codigo_Venta
    FROM
    (
        SELECT codigo_Venta,
               codigo_producto
        FROM ventas
        WHERE codigo_producto in (1,2,3)    GROUP BY codigo_Venta,
                 codigo_producto
    ) AS o
    GROUP BY o.codigo_Venta
    HAVING COUNT(*) >= 3;
    
    
    
    
    Un saludo

    • Marcado como respuesta Danny Mosquera viernes, 29 de junio de 2018 17:14
    viernes, 29 de junio de 2018 5:35
  • Hola Danny,

    Este problema se conoce como Division Relacional (Relational Division) y en este caso division exacta.

    declare @T table (
    codigo_producto int not null primary key
    );
    
    insert into @T (codigo_producto) values (1), (2), (3);
    
    select A.codigo_venta
    from ventas as A left outer join @T as B on B.codigo_producto = A.codigo_producto
    group by A.codigo_venta
    having count(A.codigo_producto) = (select count(*) from @T)
    and count(B.codigo_producto) = (select count(*) from @T);


    Puedes usar este query como tabla derivada para traer el detalle de cada venta.

    Si usas SQL Server 2017 entonces pudieras usar la funcion STRING_AGG pero recomiendo que hagas una comparacion de desempenio.

    with R as (
    select 
        codigo_venta, 
        string_agg(codigo_producto, ',') within group (order by codigo_producto) as productos
    from
        dbo.ventas
    group by
        codigo_venta
    )
    select *
    from R
    where productos = '1,2,3';

    Tambien te dejo un video muy bueno sobre una charla dada por Peter Larsson sobre este tema.  Sus soluciones suelen tener muy buen desempenio.

    Relational Division


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    viernes, 29 de junio de 2018 11:43