Случай, когда с Count внутри предложения ON в JOIN - PullRequest
0 голосов
/ 28 мая 2019

Внутри JOIN (BB_VENDASDOCUMENTOS VD) мне нужно выбрать, будет ли VD.ENTRADASAIDA 'S' или 'E', что мне действительно нужно, если есть хотя бы один BB_VENDASDOCUMENTOS, где ENTRADASAIDA = 'S', используйте 'S', иначе 'N'

Я пытался сделать СЛУЧАЙ, КОГДА СЧИТАЯ ЧИСЛО VD.ENTRADASAIDA = 'S', если больше 0, будет использоваться 'S', иначе 'N', но я получаю ошибку это и агрегат не могут появляться в предложении ON ...

SELECT
 CASE WHEN CENTROCUSTO.DESCRICAO IS NOT NULL THEN CENTROCUSTO.DESCRICAO + '|' ELSE '' END AS [text()]
                                                  FROM BB_PNRACCOUNTINGS ACC1
                                                  JOIN BB_VENDASDOCUMENTOS VD
                                                    ON ( VD.ACCOUNTING = ACC1.HANDLE
                                                                AND  VD.ENTRADASAIDA = CASE WHEN count(case when VD.ENTRADASAIDA = 'S' THEN 1 ELSE NULL END ) > 0 THEN 'S'  ELSE 'E'  END
                                                    AND  VD.PESSOA = ACC1.BB_CLIENTE
                                                    AND ( ( VD.CANCELADO = 'N' ) OR (VD.CANCELADO IS NULL) ) )
                                                  LEFT JOIN BB_CLIENTECC CENTROCUSTO
                                                    ON (CENTROCUSTO.Handle = VD.CENTRODECUSTO)
                                                                  WHERE CENTROCUSTO.DESCRICAO IS NOT NULL

1 Ответ

0 голосов
/ 28 мая 2019

Вам нужно будет отсканировать таблицу дважды.Один раз пометить каждую группу буквой S или E, а затем собрать только записи, соответствующие условию.Я хотел бы сделать это, присоединившись к подзапросу, а затем присоединиться снова при условии.Я не уверен, что приведенный ниже синтаксис является на 100% правильным, однако основная концепция здесь есть.

;WITH BB_VENDASDOCUMENTOSCalc AS
(
    SELECT ACCOUNTING,PESSOA,
        ENTRADASAIDACalc = count(case when ENTRADASAIDA = 'S' THEN 1 ELSE NULL END ) > 0 THEN 'S'  ELSE 'E'  END
    FROM 
        BB_VENDASDOCUMENTOS
    WHERE
        (CANCELADO='N' OR CANCELADO IS NULL)
    GROUP BY 
        ACCOUNTING,
        PESSOA
    )
SELECT
 CASE WHEN CENTROCUSTO.DESCRICAO IS NOT NULL THEN CENTROCUSTO.DESCRICAO + '|' ELSE '' END AS [text()]
                                                  FROM BB_PNRACCOUNTINGS ACC1
                                                  JOIN BB_VENDASDOCUMENTOSCalc VD1 ON VD1.ACCOUNTING = ACC1.HANDLE AND VD1.PESSOA = ACC1.BB_CLIENTE
                                                  JOIN BB_VENDASDOCUMENTO VD ON  VD.ACCOUNTING = ACC1.HANDLE AND VD.PESSOA = ACC1.BB_CLIENTE AND VD.ENTRADASAIDA = VD1.ENTRADASAIDACalc
                                                  LEFT JOIN BB_CLIENTECC CENTROCUSTO
                                                    ON (CENTROCUSTO.Handle = VD.CENTRODECUSTO)
                                                                  WHERE CENTROCUSTO.DESCRICAO IS NOT NULL 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...