none
Juntar registros y hacerlos columnas RRS feed

  • Pregunta

  • Hola buenas tardes,

    Tengo una tabla de la cual los registros coinciden en  repetidas ocasiones en los primeros 7 campos, y los siguientes 4 campos no coinciden, entonces lo que quiero hacer es agrupar los registros que coincidan en esos 7 campos como en uno solo, y los otros 4 campos restantes en columnas siguientes.

    Hago este select sencillo:

    SELECT PAIS, GIRO, NUM_CIA, SUCURSAL, CLIENTE, PRODUCTO, VENDEDOR, SUM(CANTIDAD_ACT) AS CANTIDAD, SUM(VALOR_ACT) AS VALOR, ANIO, MES
    FROM VENTAS
    GROUP BY PAIS,  GIRO, NUM_CIA, , SUCURSAL, CLIENTE, PRODUCTO, VENDEDOR, ANIO, MES

    Y me trae esto (lo pegue en excel)

    Como vemos el registro 2,6 y 7 coinciden en los primeros siete campos, el registro 1 y 8 también, y por último el 3 y el 4. Esos los quisiera agrupar en un solo registro y los campos que no se repiten ponerlos al final acomodados como cantidad y valor, que es en realidad la venta de cada mes para el mismo país, cliente, sucursal, etc.

    Quedando mas o menos así...

    No se si se podrá desde un Query o es mejor hacer un SP o desde un array en .net.

    Gracias de antemano!

    martes, 26 de junio de 2018 16:59

Respuestas

  • Una idea seria extaer todos lo anios, agregar 12 meses por cada anio y generar el producto cartesiano (cross join) entre el resultado y (PAIS, GIRO, NUM_CIA, SUCURSAL, CLIENTE, PRODUCTO, VENDEDOR). De esta manera pudes usar un outer join para completar el requerimiento.



    AMB

    Some guidelines for posting questions...

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

    miércoles, 27 de junio de 2018 16:38
  • Me parece que pudieras pivotear basandonos en el mes y anio.

    with R as (

    SELECT
        PAIS, GIRO, NUM_CIA, SUCURSAL, CLIENTE, PRODUCTO, VENDEDOR,
        SUM(CANTIDAD_ACT) AS CANTIDAD,
        SUM(VALOR_ACT) AS VALOR,
        ANIO, MES,
        row_number() over(
        partition by PAIS,  GIRO, NUM_CIA, , SUCURSAL, CLIENTE, PRODUCTO, VENDEDOR
        order by ANIO, MES
        ) as rn
    FROM
        VENTAS
    GROUP BY
        PAIS,  GIRO, NUM_CIA, , SUCURSAL, CLIENTE, PRODUCTO, VENDEDOR, ANIO, MES

    )

    select 
        PAIS,  GIRO, NUM_CIA, , SUCURSAL, CLIENTE, PRODUCTO, VENDEDOR, 
        sum(case when rn = 1 then cantidad end) as cantidad_1,
        sum(case when rn = 1 then valor end) as valor_!,
        sum(case when rn = 2 then cantidad end) as cantidad_2,
        sum(case when rn = 2 then valor end) as valor_2,
        sum(case when rn = 3 then cantidad end) as cantidad_3,
        sum(case when rn = 3 then valor end) as valor_3
    from
        R
    group by 
        PAIS,  GIRO, NUM_CIA, , SUCURSAL, CLIENTE, PRODUCTO, VENDEDOR;


    AMB

    Some guidelines for posting questions...

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

    • Marcado como respuesta jaguar17 jueves, 28 de junio de 2018 1:53
    martes, 26 de junio de 2018 17:44

Todas las respuestas

  • Me parece que pudieras pivotear basandonos en el mes y anio.

    with R as (

    SELECT
        PAIS, GIRO, NUM_CIA, SUCURSAL, CLIENTE, PRODUCTO, VENDEDOR,
        SUM(CANTIDAD_ACT) AS CANTIDAD,
        SUM(VALOR_ACT) AS VALOR,
        ANIO, MES,
        row_number() over(
        partition by PAIS,  GIRO, NUM_CIA, , SUCURSAL, CLIENTE, PRODUCTO, VENDEDOR
        order by ANIO, MES
        ) as rn
    FROM
        VENTAS
    GROUP BY
        PAIS,  GIRO, NUM_CIA, , SUCURSAL, CLIENTE, PRODUCTO, VENDEDOR, ANIO, MES

    )

    select 
        PAIS,  GIRO, NUM_CIA, , SUCURSAL, CLIENTE, PRODUCTO, VENDEDOR, 
        sum(case when rn = 1 then cantidad end) as cantidad_1,
        sum(case when rn = 1 then valor end) as valor_!,
        sum(case when rn = 2 then cantidad end) as cantidad_2,
        sum(case when rn = 2 then valor end) as valor_2,
        sum(case when rn = 3 then cantidad end) as cantidad_3,
        sum(case when rn = 3 then valor end) as valor_3
    from
        R
    group by 
        PAIS,  GIRO, NUM_CIA, , SUCURSAL, CLIENTE, PRODUCTO, VENDEDOR;


    AMB

    Some guidelines for posting questions...

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

    • Marcado como respuesta jaguar17 jueves, 28 de junio de 2018 1:53
    martes, 26 de junio de 2018 17:44
  • Hola Hunchback, gracias por la ayuda, me esta sirviendo muchísimo!

    Solo una duda, después del primer paso me queda algo así, 

    Cuando hago el select con las sentencias case, me los acomoda bien después de cada registro, pero no logro conseguir que coincidan los meses... por ejemplo vemos que en los registros en la columna mes no hay ningún 1, entonces no existe Enero, por lo pronto esos campos quedan vacíos, y debe de empezar del mes 2 del año 2017. Entiendo que en el select lo que guía es el campo "rn" pero puedo hacer algo para que los meses que no existan me los llene con nulos o ceros?  No se si me explique?

    Gracias de antemano!

    martes, 26 de junio de 2018 22:16
  • Una idea seria extaer todos lo anios, agregar 12 meses por cada anio y generar el producto cartesiano (cross join) entre el resultado y (PAIS, GIRO, NUM_CIA, SUCURSAL, CLIENTE, PRODUCTO, VENDEDOR). De esta manera pudes usar un outer join para completar el requerimiento.



    AMB

    Some guidelines for posting questions...

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

    miércoles, 27 de junio de 2018 16:38