SQL Server: как построить IF-подобную систему в предложении where?

У меня есть таблица, как показано ниже, после нескольких соединений

username    trandate    positionname       ChannelID
--------    ----        ------------       ---------
system      01/01/2019                     1
anderson    06/04/2019  chief              1
williams    07/03/2019  chief              2
julie       15/02/2019  technician         48
julie       27/05/2019  chief technician   21

Я хочу подсчитать общее количество транзакций, сумму, сгруппированную по месяцам, годам и типу канала.

есть условие: если channelID равен «1», то запрос должен исключать (1) транзакции с нулевым значением на «positionname» или (2) транзакции с «системным» именем пользователя.

Мой код выглядит примерно так:

    select DISTINCT

DATEPART(YEAR,a.TranDate) as [year],
DATEPART(MONTH,a.TranDate) as [month],

    count(*) as [transaction number], 
    sum(a.Amount) as [Total amount], 

    b.Name as [branch name], 
    c.ChannelName as [channel] 

    from transactions_main as a

left join branches      as b    WITH (NOLOCK) ON a.TranBranch=b.BranchId  
left join Channels      as c    WITH (NOLOCK) ON a.ChannelId=c.ChannelId  
left join Staff_Info    as d    WITH (NOLOCK) ON a.UserName=d.UserCode 

where 
        a.TranDate>'20181231' 
        and b.name not in ('HQ')
        and (a.ChannelId=1 
            and d.positionname is not null 
            and a.UserName not in ('SYSTEM', 'auto') ) 


            group by b.Name, c.ChannelName,DATEPART(YEAR,a.TranDate), DATEPART(MONTH,a.TranDate) 

order by b.Name, Year,month

В конце концов, конечно, не сработало. Я получил сумму и количество транзакций только для channelID = 1.

БОНУС: Вы хотите помочь в другой моей теме? в котором мне также нужна помощь по индексации:

определение должности сотрудника при совершении определенной операции

вот оно: ссылка


person Cemil    schedule 01.06.2020    source источник
comment
Уберите a.ChannelId = 1, и вы, вероятно, получите больше каналов.   -  person Gordon Linoff    schedule 01.06.2020


Ответы (1)


используйте оператор ИЛИ

where 
        a.TranDate>'20181231' 
        and b.name not in ('HQ')
        and (   
                (a.ChannelId=1 
                and d.positionname is not null 
                and a.UserName not in ('SYSTEM', 'auto') ) 
                )
                OR
                a.ChannelId<>1 
            )
person Wouter    schedule 01.06.2020