Почему мой запрос находится внутри случая, когда не удается? - PullRequest
0 голосов
/ 29 февраля 2020

Я пытаюсь выполнить запрос SQL Server Case, и у меня возникает ошибка. Позвольте мне попытаться объяснить, почему я делаю то, что я делаю, а также то, что я ищу в конечном результате.

У меня есть две таблицы. 1, который имеет идентификатор возможности (в данном случае A.ID), а во второй таблице есть учетные записи с одним интересующим меня столбцом (B.Q3ABM __ C). То, что я прошу SQL, сделать в этом случае, когда для каждого A.id, который является пустым в столбце B.Q3ABM __ C, дайте мне 1, а затем снова наоборот. Почему это не удается?

SELECT B.ID as Account_ID, B.FULL_ACCOUNT_ID__C, A.ID as Opportunity_ID,A.name, stagename,closedate,A.createddate,
OPPORTUNITY_PRODUCT__C,AMOUNT, B.Q3ABM__C, B.Drip_Campaign_Code__c,OPPORTUNITYTYPE_STRING__C,
CASE 
    WHEN (SELECT A.id FROM SF_OPPORTUNITY as a 
LEFT JOIN SF_ACCOUNT as b on A.Accountid = b.ID where B.Q3ABM__C IS NULL) THEN 1
    ELSE 0
    END AS 'Does Not Exist in Q3DM',
CASE 
    WHEN (SELECT A.id FROM SF_OPPORTUNITY as a
 LEFT JOIN SF_ACCOUNT as b on A.Accountid = b.ID where B.Q3ABM__C IS NOT NULL) THEN 1
    ELSE 0
    END AS 'Exists in Q3DM'

FROM SF_OPPORTUNITY as a
LEFT JOIN SF_ACCOUNT as b on a.ACCOUNTID = b.ID 
WHERE A.createddate >= '7-1-2019'
AND CLOSEDATE <= '12-31-2019'

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 февраля 2020

Попробуйте (используйте столбцы в предложениях «Выбор» и «Где» в соответствии с вашими требованиями):

SELECT A.*,B.* , 
CASE WHEN B.Q3ABM__C IS NULL THEN 1 ELSE 0 END AS 'DOES NOT EXISIT IN Q3DM',
CASE WHEN B.Q3ABM__C IS NOT NULL THEN 1 ELSE 0 END AS 'EXISITS IN Q3DM'
FROM PLS.SF_OPPORTUNITY A
FULL JOIN PLS.SF_ACCOUNT B ON A.ACCOUNTID=B.ID
0 голосов
/ 29 февраля 2020

Если вы выбираете записи за указанный c период, но вы хотите проверить для NULL с и NOT NULL с для всех записей, вы можете проверить, для каких ID существуют значения NULL. Если существует NULL vales, то мы можем вычислить первый столбец Does Not Exist in Q3DM, если нет, второй Exists in Q3DM:

WITH DataSource AS
(
    SELECT DISTINCT A.id 
    FROM SF_OPPORTUNITY as a 
    LEFT JOIN SF_ACCOUNT as b 
        on A.Accountid = b.ID 
    where B.Q3ABM__C IS NULL
)
SELECT B.ID as Account_ID
      ,B.FULL_ACCOUNT_ID__C
      ,A.ID as Opportunity_ID
      ,A.name
      ,stagename
      ,closedate
      ,A.createddate
      ,OPPORTUNITY_PRODUCT__C
      ,AMOUNT
      ,B.Q3ABM__C
      ,B.Drip_Campaign_Code__c
      ,OPPORTUNITYTYPE_STRING__C
      ,CASE DS.Id IS NOT NULL THEN  1 ELSE 0 END 'Does Not Exist in Q3DM'
      ,CASE DS.Id IS NULL THEN 1 ELSE 0 END 'Exists in Q3DM' 
FROM SF_OPPORTUNITY as a
LEFT JOIN SF_ACCOUNT as b 
    on a.ACCOUNTID = b.ID
LEFT JOIN DataSource DS
    ON A.ACCOUNTID = DS.ID
WHERE A.createddate >= '7-1-2019'
    AND CLOSEDATE <= '12-31-2019';

Если вас интересует только данный период и проверка значение только для текущей записи:

SELECT B.ID as Account_ID
      ,B.FULL_ACCOUNT_ID__C
      ,A.ID as Opportunity_ID
      ,A.name
      ,stagename
      ,closedate
      ,A.createddate
      ,OPPORTUNITY_PRODUCT__C
      ,AMOUNT
      ,B.Q3ABM__C
      ,B.Drip_Campaign_Code__c
      ,OPPORTUNITYTYPE_STRING__C
      ,CASE DS.Id IS NULL THEN  1 ELSE 0 END 'Does Not Exist in Q3DM'
      ,CASE DS.Id IS NOT NULL THEN 1 ELSE 0 END 'Exists in Q3DM' 
FROM SF_OPPORTUNITY as a
LEFT JOIN SF_ACCOUNT as b 
    on a.ACCOUNTID = b.ID
LEFT JOIN DataSource DS
    ON A.ACCOUNTID = DS.ID
WHERE A.createddate >= '7-1-2019'
    AND CLOSEDATE <= '12-31-2019'
...