Включение столбца логического флага в результаты - PullRequest
2 голосов
/ 20 мая 2019

Я хочу включить столбец логических флагов в мои результаты, чтобы обозначить наличие памятки «IN ##» для любого данного клиента.Например, в приведенных ниже таблицах BOB содержит 2 записки в таблице SEC.Я хочу вернуть INFlag = 1 для обеих строк, так как одна из его заметок содержит 'IN' (меня интересуют только пометки 'IN', поэтому операторы CASE обнуляют все остальное).

Я уже пробовалподсчет в выбранном случае и вложенные подзапросы, но лучшее, что я могу сделать, это пометить только строки с заметкой «IN».Я хочу пометить ВСЕ строки любого конкретного клиента при условии, что у них есть памятка «IN».

Две таблицы:

dbo.BASE
    id    name    image
    ==    ====    =====
    1     BOB     001
    2     RICK    002
    3     JOE     003
    4     BILL    004
    5     KEVIN   005

dbo.SEC
    id    memo    date
    ==    ====    ======
    1     IN20    4/1/19
    1     ME      1/1/18
    2     MO      1/1/18
    3     IN18    6/1/17
    3     MO      5/1/19
    4     ME      1/1/16
    5     ME      1/1/17
    5     MO      8/1/17
    5     MI      2/1/18

SELECT
    b.name              as [PName],
    COUNT(s.memo)       as [Memos],

    CASE
        WHEN s.memo like 'IN[0-9][0-9]'
        THEN s.memo
        ELSE NULL END
                        as [INID],
    CASE
        WHEN s.memo like 'IN[0-9][0-9]'
        THEN s.date
        ELSE NULL END
                        as [INDate],

    <<<FLAG Column [INFlag]>>>

FROM
    dbo.BASE b
    join dbo.SEC s on b.id = s.id

...

Ожидаемый результат:

PName   Memos   INID    INDate  INFlag
=====   =====   ====    ======  ======
BOB     2       IN20    4/1/19  1
BOB     2       NULL    NULL    1
RICK    1       NULL    NULL    0
JOE     2       IN18    6/1/17  1
JOE     2       NULL    NULL    1
BILL    1       NULL    NULL    0
KEVIN   3       NULL    NULL    0
KEVIN   3       NULL    NULL    0
KEVIN   3       NULL    NULL    0

Клиенты RICK, BILL и KEVIN не имеют памятки «IN», поэтому я хочу пометить все результаты для них с INFlag = 0.Клиенты BOB и JOE имеют памятку «IN», поэтому любые строки с их именем получают INFlag = 1.

1 Ответ

2 голосов
/ 20 мая 2019

Для получения нужных результатов используйте оконные функции:

select b.name, count(*) over (partition by id) as num_memos,
       (case when memo like 'IN%' then memo end) as INmemo,
       (case when memo like 'IN%' then date end) as INdate,
       max(case when memo like 'IN%' then 1 else 0 end) over (partition by name) as INlag
from base b join
     sec s
     on b.id = s.id

Вы также можете добавить информацию в каждую строку в base, используя EXISTS:

select b.*, 
       (case when exists (select 1
                          from sec s
                          where s.id = b.id and
                                s.memo like 'IN%'
                         )
              then 1 else 0
        end) as INflag
from base b;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...