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.
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.
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.
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.
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)