SQL JOIN с результатом оператора CASE - PullRequest
0 голосов
/ 03 февраля 2019

Есть ли способ объединить результат оператора case с таблицей ссылок без создания CTE, например.

Result AFTER Оператор CASE:

ID   Name   Bonus Level (this is the result of a CASE statement)
01   John     A
02   Jim      B
01   John     B
03   Jake     C

Справочная таблица

A   10%
B   20%
C   30%

Затем я хочу получить% рядом с каждым сотрудником, затем максимальный возраст% с помощью функции MAX и группировать по идентификатору, а затем снова связать его со ссылкой, чтобы каждыйСотрудник имеет единственный правильный (наивысший) уровень бонуса рядом с его именем.(Это полностью вымышленный сценарий, но очень похожий на то, что я ищу).

Просто нужна помощь для объединения результата оператора CASE с таблицей ссылок.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Не знаю, слишком ли я упрощаю, но, основываясь на результатах вашего запроса о результатах, почему бы просто не присоединить это к справочной таблице и сделать максимум, сгруппированный по ID / имени.Поскольку идентификатор и имя человека не изменятся, так как это один и тот же человек, вы просто получаете максимум, который хотите.Чтобы завершить Бонусный уровень, воссоединитесь только с той частью после максимального процента, определенного для человека.

select
      lvl1.ID,
      lvl1.Name,
      lvl1.FinalBonus,
      rt2.BonusLvl
   from
      ( select
              PQ.ID,
              PQ.Name,
              max( rt.PcntBonus ) as FinalBonus
           from
              (however you 
                  got your 
                  data query ) PQ
                 JOIN RefTbl rt
                    on PQ.BonusLvl = rt.BonusLvl
       ) lvl1
          JOIN RefTbl rt2
             on lvl1.FinalBonus = rt2.PcntBonus

Поскольку Бонусные уровни (A, B, C) не гарантируют соответствующие% уровни (10,20,30), я сделал это таким образом ... Иначе, вы могли бы просто использовать max () как для уровня бонуса, так и для процента.Но что, если ваши бонусные уровни были указаны как что-то вроде

Limited    10%
Aggressive 20%
Ace        30%

Вы могли видеть, что у максимума уровня выше было бы «Ограничено», но максимальный% = 30 связан с продажами «туза»rep ... Сначала получите 30%, а затем посмотрите, что это за метка.

0 голосов
/ 03 февраля 2019

Вместо временного значения в результате оператора case вы можете использовать оператор select из справочной таблицы.

Так что если ваш оператор case выглядит следующим образом:

case  when variable1=value then bonuslevel =A

Затем, замена его так может помочь

case when variable1=value then (select percentage from ReferenceTable where variable2InReferenceTable=A)
...