SQL:条件IF在哪里之后?

时间:2019-01-23 23:04:24

标签: sql sql-server azure-sql-database

我正在尝试查询以下示例数据,如果RowNum = 1或ToUse =X。 但是,如果“帐户”具有两个值(红色方块内的示例),然后对“ ToUse”列进行优先级排序,则需要添加一个额外条件,在下面示例中,ID为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行也应突出显示为黄色)

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 :(得分:1)

我建议通过包含类似于order by列的RowNum来更改用于建立case expression的{​​{1}}。这样,我认为您可以省去该列。

ToUse

答案 1 :(得分:0)

如果您问的是我想问的问题(可能不是,这可能意味着您最后一个示例的第14-17行也应显示为黄色),那么您可以尝试以下方法:

(未优化,但这只是一个起点)

Select * from assorted_tables
where ToUse = 'X'
or (RowNum = 1
    AND
    accountID not in (select accountID from assorted_tables
                     where toUse = 'X')
   )