SQL: условный IF после где? - PullRequest
       1

SQL: условный IF после где?

0 голосов
/ 24 января 2019

Я пытаюсь запросить приведенные ниже примеры данных, где, если RowNum = 1 или ToUse = X. Однако мне нужно добавить дополнительное условие, если у учетной записи есть оба значения (пример в красном квадрате), а затем установить приоритет для столбца "ToUse ", в приведенном ниже примере учетная запись с идентификатором 6 имеет 6 записей:

  • 3 для обслуживания имущества - 19734
  • 3 для обслуживания имущества - 19733

SQL Question

Я хочу, чтобы результат запроса отклонил 3 значения для обслуживания свойства - 19734

Ниже этого изображения используется текущий запрос, который я использую

SELECT 
    Id,
    OpportunityId,
    OpportunityName,
    OpportunityStage,
    Email,
    RowNum,
    CreatedDate,
    ToUse,
    FirstName,
    LastName,
    Mobile,
    AccountName,
    AccOppotunityInProgress,
    AccTotalLoanPaid,
    AccTotalClosedLost,
    TotalOppsLoanFunded,
    Useractive,
    EmailOptOut,
    AccountID
    FROM (
        SELECT 
            con.Id AS [Id], 
            opp.Id AS [OpportunityId], 
            acc.Id AS [AccountID],
            opp.Name AS [OpportunityName],
            opp.CreatedDate AS [CreatedDate],
            opp.StageName AS [OpportunityStage],
            con.FirstName AS [FirstName],
            con.LastName AS [LastName],
            con.MobilePhone AS [Mobile],
            con.Useractive__c AS [Useractive],
            con.Email AS [Email],
            con.HasOptedOutOfEmail AS [EmailOptOut],
            acc.Name AS [AccountName],
            acc.Total_Opportunities_in_Progress__c AS [AccOppotunityInProgress],
            acc.Total_Loan_Paid__c AS [AccTotalLoanPaid],
            acc.Total_Closed_Lost__c AS [AccTotalClosedLost],
            opp.Total_Opportunities_Loan_Funded__c AS [TotalOppsLoanFunded],
            CASE WHEN opp.StageName = 'Loan Funded' 
            THEN 'X'
            ELSE 'FU'
            END AS ToUse,               
            row_number() OVER(PARTITION BY opp_con_role.ContactId ORDER BY opp.CreatedDate DESC) AS RowNum 
        From [Opportunitycontactrole] Opp_Con_Role
        INNER JOIN [Opportunity] opp
            On Opp_Con_Role.Opportunityid = Opp.Id 
        INNER JOIN [Contact] con
            On Opp_Con_Role.Contactid = Con.Id 
        INNER JOIN [account] acc
            ON acc.Id = opp.AccountId 
        WHERE con.Email IS NOT NULL OR con.MobilePhone IS NOT NULL
    ) sr ORDER BY sr.OpportunityName

Это схема таблиц

Schema of database

Ожидаемые результаты будут в таблице ниже без строк, которыебыли выделены желтым цветом: (строки 14 -17 также должны были выделены yello)

sql-expected results

РЕДАКТИРОВАТЬ: Когда я добавляю этот раздел, я получаю следующеерезультат, который так близок к тому, что я хочу, однако запись сстоимость этапа запрашиваемых документов должна быть 1

ROW_NUMBER() OVER (PARTITION BY opp_con_role.ContactId ORDER BY CASE WHEN opp.StageName = 'Loan Funded' THEN 1 ELSE 2 END, opp.CreatedDate DESC) AS RowNum

query result

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Я предлагаю изменить order by, используемый для установления RowNum, включив case expression, аналогичный тому, который используется для столбца ToUse. Таким образом, я думаю, что вы можете обойтись без этой колонки.

SELECT
    *
FROM (
    SELECT
        con.Id                                                                                    AS [Id]
      , opp.Id                                                                                    AS [OpportunityId]
      , acc.Id                                                                                    AS [AccountID]
      , opp.Name                                                                                  AS [OpportunityName]
      , opp.CreatedDate                                                                           AS [CreatedDate]
      , opp.StageName                                                                             AS [OpportunityStage]
      , con.FirstName                                                                             AS [FirstName]
      , con.LastName                                                                              AS [LastName]
      , con.MobilePhone                                                                           AS [Mobile]
      , con.Useractive__c                                                                         AS [Useractive]
      , con.Email                                                                                 AS [Email]
      , con.HasOptedOutOfEmail                                                                    AS [EmailOptOut]
      , acc.Name                                                                                  AS [AccountName]
      , acc.Total_Opportunities_in_Progress__c                                                    AS [AccOppotunityInProgress]
      , acc.Total_Loan_Paid__c                                                                    AS [AccTotalLoanPaid]
      , acc.Total_Closed_Lost__c                                                                  AS [AccTotalClosedLost]
      , opp.Total_Opportunities_Loan_Funded__c                                                    AS [TotalOppsLoanFunded]
      , CASE WHEN opp.StageName = 'Loan Funded' THEN 'X' ELSE 'FU' END                            AS ToUse
      , ROW_NUMBER() OVER (PARTITION BY opp_con_role.ContactId
        ORDER BY CASE WHEN opp.StageName = 'Loan Funded' THEN 1 ELSE 2 END, opp.CreatedDate DESC) AS RowNum
    FROM [Opportunitycontactrole] Opp_Con_Role
    INNER JOIN [Opportunity] opp ON Opp_Con_Role.Opportunityid = Opp.Id
    INNER JOIN [Contact] con ON Opp_Con_Role.Contactid = Con.Id
    INNER JOIN [account] acc ON acc.Id = opp.AccountId
    WHERE con.Email IS NOT NULL
    OR con.MobilePhone IS NOT NULL
) sr
WHERE RowNum = 1
ORDER BY
    sr.OpportunityName 
0 голосов
/ 24 января 2019

Если вы спрашиваете, что, как я думаю, вы спрашиваете (а это может быть не так, поскольку это будет означать, что строки 14-17 вашего последнего примера также должны быть выделены желтым цветом), вы можете попробовать это:

(Это неоптимизировано, но только в качестве отправной точки)

Select * from assorted_tables
where ToUse = 'X'
or (RowNum = 1
    AND
    accountID not in (select accountID from assorted_tables
                     where toUse = 'X')
   )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...