Consulta SQL de datos cruzados

Hola buenas, solicito su apoyo o ayuda para la siguiente consulta:

Queremos obtener una consulta sql que nos devuelva los siguientes datos cruzados.

Partimos de la tabla de contratos de servicio:

Consulta A
SELECT T0.[CstmrCode], T0.[CstmrName], T0.[U_tipo_facturacion], T0.[ContractID] FROM OCTR T0 WHERE T0.[Status] ='A' and T0.[U_tipo_facturacion] <>'ANUAL'

Con esta consulta obtenemos el listado de clientes con contrato y ahora queremos evaluar si este cliente tiene facturas emitidas cada mes.

Consulta B
select OINV.CardCode, OINV.CardName, OINV.DocDate, OINV.DocNum, (OINV.DocTotal-OINV.VatSum) as 'Importe', OINV.DocEntry, OINV.U_Contrato, OCRD.U_tip_factura from INV1 inner join OINV on INV1.Docentry=OINV.DocEntry inner join OCRD on OINV.CardCode=OCRD.CardCode where INV1.TrgetEntry is null and INV1.AcctCode in ('705028', ‘705031’) and OINV.DocDate>='20210601' and OINV.DocDate<='20210630' and OCRD.GroupCode<>145

Esta consulta es la que nos devuelve las facturas emitidas para este tipo de clientes filtrando en este caso el mes de Junio.

Queremos detectar de la primera consulta (A) si se han ido emitiendo facturas en la segunda consulta (B) y en el caso de ser más de una factura que aparezcan las distintas líneas.

Esta consulta tendría columnas para cada mes del año.

No logro dar con como hacerlo, tiene que ser con subconsultas o consultas anidadas, pero no logro obtener los datos.

Gracias por anticipado y un saludo desde :es:

Hola @meqs

yo probaría a obtener todas las facturas de todos los clientes que tienen contrato: añadir en el where una condición oinv.carcode in (select cstmrcode from octr where tus condiciones) y así obtienes todas las facturas de clientes con contrato de facturación anual.

Si quieres obtener el listado de los clientes con contrato pero sin factura habría que añadir una condición a la consulta A de que el cliente no esté en la lista de facturas.

Para obtener los datos por meses, una opción sería replicar 12 veces la consulta verificada y pasar como parámetro el año, y utilizar las funciones MONTH y YEAR con la fecha del documento para filtrar. Seguramente haya otras más correctas, pero creo que es la más sencilla.

Un saludo
Agustín

Hola @Amarcos cuando intento esas condiciones es cuando aparecen los líos…
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

Hola @meqs

en la primera de las sugerencias, prueba con select distinct cstmrcode o pon un group by (quizás no te lo permita por ser una subquery).

Un saludo

Buenas, al hacer un join entre la primera y la segunda consulta te debería devolver todas las facturas emitidas para los clientes con contratos activos.

select OINV.CardCode, OINV.CardName, OINV.DocDate, OINV.DocNum, 
(OINV.DocTotal-OINV.VatSum) as 'Importe', OINV.DocEntry, OINV.U_Contrato, 
OCRD.U_tip_factura
From INV1 
inner join OINV on INV1.DocEntry = OINV.DocEntry
inner join OCRD on OINV.CardCode = OCRD.CardCode
inner join OCTR on OINV.CardCode = OCTR.CstmrCode and OCTR.Status = 'A' and OCTR.U_tipo_facturacion <> 'ANUAL'
where INV1.TrgetEntry is null and INV1.AcctCode in ('705028', '705031')
and OINV.DocDate >= '20210601' and OINV.DocDate <= '20210630'
and OCRD.GroupCode <> 145

Hola @Dark_katt esta consulta me devuelve de las facturas emitidas su cliente y/o su contrato, lo que pretendo conseguir es justamente lo contrario, detectar si algun cliente con contrato activo no le he emitido la correspondiente factura.

Gracias por la respuesta.

Seguiré indagando en ella.

Al final con otra consulta que realice y lo que estuve indagando un tiempo después y sin querer…Aquí está:

SELECT T0.CstmrCode, T0.CstmrName, T0.U_tipo_facturacion, T0.ContractID 
FROM OCTR T0 
WHERE T0.Status ='A' and T0.U_tipo_facturacion <>'ANUAL' and
T0.CstmrCode not in (select distinct(OINV.CardCode) 
from INV1 
inner join OINV on INV1.Docentry=OINV.DocEntry 
inner join OCRD on OINV.CardCode=OCRD.CardCode 
where INV1.TrgetEntry is null and INV1.AcctCode in ('705028', '705031') and OINV.DocDate>='20210601' and OINV.DocDate<='20210630' and OCRD.GroupCode<>145) 

Este tema se cerró automáticamente 7 días después de la última publicación. No se permiten nuevas respuestas.