Usuario
Unión de 2 consultas

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_movY 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 descpero 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
Todas las respuestas
-
- Propuesto como respuesta Pablo RubioModerator viernes, 22 de noviembre de 2019 23:38
-
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.
- Editado José Diz viernes, 22 de noviembre de 2019 22:12
- Propuesto como respuesta Pablo RubioModerator viernes, 22 de noviembre de 2019 23:38
-
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.