Принимать приоритет по указанному значению c из таблицы - PullRequest
0 голосов
/ 21 января 2020

Для каждого отдельного человека, у которого есть Toyota, возьмите только Toyota и отфильтруйте другие машины этого человека, в противном случае принесите все машины.

This is what I'm looking for.

Фактический скрипт не будет соответствовать моим логикам c выше. Я пытался упростить свой вопрос, используя случайные имена и марки автомобилей, но цель была та же, поскольку я хотел получить конкретный адресный код c и отфильтровать остальное, если он существует для имен других поставщиков (см. Ниже) , Спасибо, GMB.

GPMEM.dbo.PM00200 a           -- Vendor Master
LEFT JOIN GPMEM.dbo.PM30200 b -- Historical/Paid Transactions
ON a.VENDORID = b.VENDORID
LEFT JOIN GPMEM.dbo.PM20000 c -- Open/Posted Transactions
ON a.VENDORID = c.VENDORID
LEFT JOIN (
SELECT d.*,
    rank() over(
            partition by d.VENDORID
            order by case when d.ADRSCODE = 'ACH' THEN 0 ELSE 1 END
             )rn
FROM GPMEM.dbo.PM00300 d
) d  -- Vendor Address Master
ON a.VENDORID = d.VENDORID
WHERE
d.rn = 1 

Ответы [ 2 ]

1 голос
/ 21 января 2020

Вы можете использовать оконные функции:

select colA, colB
from (
    select 
        t.*, 
        rank() over(
            partition by colA 
            order by case when colB = 'Toyota' then 0 else 1 end
        ) rn
    from mytable t
) t
where rn = 1

Трюк нравится в предложении order by в предложении over() оконной функции rank(): если у человека есть Toyota, это будет занимает первое место, а их (возможно) другие автомобили будут занимать второе место. Если у него нет Тойоты, все их машины будут на первом месте.

0 голосов
/ 21 января 2020

Вы можете сделать это с помощью фильтрации логи c:

select t.*
from t
where t.colb = 'toyota' or
      not exists (select 1 from t t2 where t2.cola = t.cola and t2.colb = 'toyota');

Если бы я использовал для этого оконные функции, я бы просто посчитал toyotas:

select t.*
from (select t.*,
             sum(case when colb = 'toyota' then 1 else 0 end) over (partition by cola) as num_toyotas
      from t
     ) t
where colb = 'toyota' or num_toyotas = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...