none
Unión de 2 consultas RRS feed

  • Pregunta

  • hola, necesito ayuda con una consulta si me pueden ayudar de antemano gracias la idea es unir 2 consultas para obtener en el mismo conjunto de datos la primera compra de un cliente y la ultima compra yo los tenia de forma individua pero resulta que tienen que aparecer en el mismo reporte

    Esta es la consulta para obtener el primer registro

    SELECT        TOP (1) fccc_clientes.cod_cliente, fccc_clientes.nombre, rvte_movs.f_mov, rvte_movs.m_total
    FROM            rcmd_listas_precio RIGHT OUTER JOIN
                             rcfc_productos ON rcmd_listas_precio.cod_rap = rcfc_productos.cod_rap AND rcmd_listas_precio.cod_corporacion = rcfc_productos.cod_corporacion RIGHT OUTER JOIN
                             rvte_movs RIGHT OUTER JOIN
                             rvtd_movs ON rvte_movs.n_mov = rvtd_movs.n_mov RIGHT OUTER JOIN
                             fccc_clientes ON rvte_movs.cod_cliente = fccc_clientes.cod_cliente ON rcfc_productos.cod_rap = rvtd_movs.cod_rap AND rcmd_listas_precio.cod_lista_prc = rvte_movs.cod_lista_prc
    WHERE        (fccc_clientes.nombre LIKE '%' + @name + '%')
    GROUP BY fccc_clientes.cod_cliente, fccc_clientes.nombre, rvte_movs.f_mov, rvte_movs.m_total
    ORDER BY rvte_movs.f_mov 

    Y esta para obtener el ultimo

    SELECT        TOP (1) fccc_clientes.cod_cliente, fccc_clientes.nombre, rvte_movs.f_mov, rvte_movs.m_total
    FROM            rcmd_listas_precio RIGHT OUTER JOIN
                             rcfc_productos ON rcmd_listas_precio.cod_rap = rcfc_productos.cod_rap AND rcmd_listas_precio.cod_corporacion = rcfc_productos.cod_corporacion RIGHT OUTER JOIN
                             rvte_movs RIGHT OUTER JOIN
                             rvtd_movs ON rvte_movs.n_mov = rvtd_movs.n_mov RIGHT OUTER JOIN
                             fccc_clientes ON rvte_movs.cod_cliente = fccc_clientes.cod_cliente ON rcfc_productos.cod_rap = rvtd_movs.cod_rap AND rcmd_listas_precio.cod_lista_prc = rvte_movs.cod_lista_prc
    WHERE        (fccc_clientes.nombre LIKE '%' + @name + '%')
    GROUP BY fccc_clientes.cod_cliente, fccc_clientes.nombre, rvte_movs.f_mov, rvte_movs.m_total
    ORDER BY rvte_movs.f_mov desc

    pero necesito unirlas 

    y al hacer esto me da un error

    SELECT        (SELECT        TOP (1) fccc_clientes.cod_cliente, fccc_clientes.nombre, rvte_movs.f_mov, rvte_movs.m_total
                              FROM            rcmd_listas_precio RIGHT OUTER JOIN
                                                        rcfc_productos ON rcmd_listas_precio.cod_rap = rcfc_productos.cod_rap AND rcmd_listas_precio.cod_corporacion = rcfc_productos.cod_corporacion RIGHT OUTER JOIN
                                                        rvte_movs RIGHT OUTER JOIN
                                                        rvtd_movs ON rvte_movs.n_mov = rvtd_movs.n_mov RIGHT OUTER JOIN
                                                        fccc_clientes ON rvte_movs.cod_cliente = fccc_clientes.cod_cliente ON rcfc_productos.cod_rap = rvtd_movs.cod_rap AND rcmd_listas_precio.cod_lista_prc = rvte_movs.cod_lista_prc
                              WHERE        (fccc_clientes.nombre LIKE '%' + @name + '%')
                              GROUP BY fccc_clientes.cod_cliente, fccc_clientes.nombre, rvte_movs.f_mov, rvte_movs.m_total
                              ORDER BY rvte_movs.f_mov) AS Expr1
    UNION ALL
    SELECT        (SELECT        TOP (1) fccc_clientes_1.cod_cliente, fccc_clientes_1.nombre, rvte_movs_1.f_mov, rvte_movs_1.m_total
                              FROM            rcmd_listas_precio AS rcmd_listas_precio_1 RIGHT OUTER JOIN
                                                        rcfc_productos AS rcfc_productos_1 ON rcmd_listas_precio_1.cod_rap = rcfc_productos_1.cod_rap AND rcmd_listas_precio_1.cod_corporacion = rcfc_productos_1.cod_corporacion RIGHT OUTER JOIN
                                                        rvte_movs AS rvte_movs_1 RIGHT OUTER JOIN
                                                        rvtd_movs AS rvtd_movs_1 ON rvte_movs_1.n_mov = rvtd_movs_1.n_mov RIGHT OUTER JOIN
                                                        fccc_clientes AS fccc_clientes_1 ON rvte_movs_1.cod_cliente = fccc_clientes_1.cod_cliente ON rcfc_productos_1.cod_rap = rvtd_movs_1.cod_rap AND 
                                                        rcmd_listas_precio_1.cod_lista_prc = rvte_movs_1.cod_lista_prc
                              WHERE        (fccc_clientes_1.nombre LIKE '%' + @name + '%')
                              GROUP BY fccc_clientes_1.cod_cliente, fccc_clientes_1.nombre, rvte_movs_1.f_mov, rvte_movs_1.m_total
                              ORDER BY rvte_movs_1.f_mov DESC) AS Expr1



    viernes, 22 de noviembre de 2019 18:07

Todas las respuestas

  • 1.- Las consultas te funcionan de manera individual?

    2.- Cual es el mensaje de error que te genera ? 


    SERGIO SANCHEZ ARIAS
    facebook twitter blogger google

    viernes, 22 de noviembre de 2019 21:56
  • Rene, prueba si el siguiente código SQL cumple con lo que solicitas.

    -- código #1
    with PriUlt as (
    SELECT C.cod_cliente, C.nombre, M.f_mov, M.m_total,
           seqP= row_number() over (partition by M.cod_cliente order by M.f_mov),
           seqU= row_number() over (partition by M.cod_cliente order by M.f_mov desc)
      from fccc_clientes as C
           inner join rvte_movs as M on M.cod_cliente = C.cod_cliente
      where C.nombre like '%' + @name + '%'
    )
    SELECT cod_cliente, nombre, f_mov, m_total
      from PriUlt
      where seqP = 1 or seqU = 1
    order by cod_cliente, f_mov;



    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    viernes, 22 de noviembre de 2019 22:08
  • Hola Rene Castillo:

    El error es que no puedes utilizar order by en dos consultas, para unir. Y a priori, que las consultas (ambas) tienen dos veces ON en la union de las tablas fcc_clientes y rvtd_movs

    A priori, la solución que te ha dado José Diz, es mucho más eficaz y soluciona tu problema. 

    Recoge el primer elemento y el último dentro de la tabla de expresión común y te muestra los dos resultados. Omite todas las tablas que parecen innecesarias para el resultado deseado. 

    La única salvedad que pueda faltar es que si un cliente no tiene movimientos, tengas que hacer un pequeño cambio en el tipo de union.

    sábado, 23 de noviembre de 2019 8:02