Как найти минимальное значение из нескольких столбцов в одной строке, учитывая, содержит ли какой-либо столбец 0, тогда он не должен участвовать в сравнении - PullRequest
1 голос
/ 04 июля 2019

Я хочу найти минимальное значение из нескольких столбцов в одной строке, и мне нужно добавить новый столбец для той же строки, содержащей это минимальное значение. Я также хочу рассмотреть, содержит ли какой-либо из столбцов 0, тогда этот столбец не должен участвовать в сравнении.

Например, У меня есть 13 столбцов, соединяющих из нескольких таблиц.

enter image description here

Я хочу получить результат, как показано ниже:

enter image description here

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

SELECT ACCGRPID,
       PERIL,
       lts1.LOCID,
       TIV,
       LIMITAMT AS LOCLIMIT,
       EQSITELIMAMT,
       EQCOMBINEDLIMAMT,
       HUSITELIMAMT,
       HUCOMBINEDLIMAMT,
       TOSITELIMAMT,
       TOCOMBINEDLIMAMT,
       FLSITELIMAMT,
       FLCOMBINEDLIMAMT,
       FRSITELIMAMT,
       FRCOMBINEDLIMAMT,
       TRSITELIMAMT,
       TRCOMBINEDLIMAMT,
       CASE WHEN (DEDUCTAMT <= 1) THEN (TIV * DEDUCTAMT) ELSE DEDUCTAMT END AS LOCDED,
       --EQDED
       CASE WHEN (EQSITEDEDAMT <= 1) THEN (TIV * EQSITEDEDAMT) ELSE EQSITEDEDAMT END AS EQSITEDEDAMT,
       CASE WHEN (EQCOMBINEDDEDAMT <= 1) THEN (TIV * EQCOMBINEDDEDAMT) ELSE EQCOMBINEDDEDAMT END AS EQCOMBINEDDEDAMT,
       --HUDED
       CASE WHEN (HUSITEDEDAMT <= 1) THEN (TIV * HUSITEDEDAMT) ELSE HUSITEDEDAMT END AS HUSITEDEDAMT,
       CASE WHEN (HUCOMBINEDDEDAMT <= 1) THEN (TIV * HUCOMBINEDDEDAMT) ELSE HUCOMBINEDDEDAMT END AS HUCOMBINEDDEDAMT,
       --TODED
       CASE WHEN (TOSITEDEDAMT <= 1) THEN (TIV * TOSITEDEDAMT) ELSE TOSITEDEDAMT END AS TOSITEDEDAMT,
       CASE WHEN (TOCOMBINEDDEDAMT <= 1) THEN (TIV * TOCOMBINEDDEDAMT) ELSE TOCOMBINEDDEDAMT END AS TOCOMBINEDDEDAMT,
       --FLDED
       CASE WHEN (FLSITEDEDAMT <= 1) THEN (TIV * FLSITEDEDAMT) ELSE FLSITEDEDAMT END AS FLSITEDEDAMT,
       CASE WHEN (FLCOMBINEDDEDAMT <= 1) THEN (TIV * FLCOMBINEDDEDAMT) ELSE FLCOMBINEDDEDAMT END AS FLCOMBINEDDEDAMT,
       --FRDED
       CASE WHEN (FRSITEDEDAMT <= 1) THEN (TIV * FRSITEDEDAMT) ELSE FRSITEDEDAMT END AS FRSITEDEDAMT,
       CASE WHEN (FRCOMBINEDDEDAMT <= 1) THEN (TIV * FRCOMBINEDDEDAMT) ELSE FRCOMBINEDDEDAMT END AS FRCOMBINEDDEDAMT,
       --TRDED
       CASE WHEN (TRSITEDEDAMT <= 1) THEN (TIV * TRSITEDEDAMT) ELSE TRSITEDEDAMT END AS TRSITEDEDAMT,
       CASE WHEN (TRCOMBINEDDEDAMT <= 1) THEN (TIV * TRCOMBINEDDEDAMT) ELSE TRCOMBINEDDEDAMT END AS TRCOMBINEDDEDAMT,
       **(SELECT MIN(Col)
        FROM (VALUES (LIMITAMT),
                     (EQSITELIMAMT),
                     (EQCOMBINEDLIMAMT),
                     (HUSITELIMAMT),
                     (HUCOMBINEDLIMAMT),
                     (TOSITELIMAMT),
                     (TOCOMBINEDLIMAMT),
                     (FLSITELIMAMT),
                     (FLCOMBINEDLIMAMT),
                     (FRSITELIMAMT),
                     (FRCOMBINEDLIMAMT),
                     (TRSITELIMAMT),
                     (TRCOMBINEDLIMAMT)
                     ) X (Col) ) AS MINLIM,**
       (SELECT MAX(Col)
        FROM (VALUES (DEDUCTAMT),
                     (EQSITEDEDAMT),
                     (EQCOMBINEDDEDAMT),
                     (HUSITEDEDAMT),
                     (HUCOMBINEDDEDAMT),
                     (TOSITEDEDAMT),
                     (TOCOMBINEDDEDAMT),
                     (FLSITEDEDAMT),
                     (FLCOMBINEDDEDAMT),
                     (FRSITEDEDAMT),
                     (FRCOMBINEDDEDAMT),
                     (TRSITEDEDAMT),
                     (TRCOMBINEDDEDAMT)
                     ) X (Col) ) AS MAXDED
FROM @LOCTS1 lts1
     OUTER APPLY (SELECT * FROM @LOCTS2 lts2 WHERE lts1.LOCID = lts2.LOCID) LO2
     OUTER APPLY (SELECT * FROM @LOCTS3 lts3 WHERE lts1.LOCID = lts3.LOCID) LO3
     OUTER APPLY (SELECT * FROM @LOCTS4 lts4 WHERE lts1.LOCID = lts4.LOCID) LO4
     OUTER APPLY (SELECT * FROM @LOCTS5 lts5 WHERE lts1.LOCID = lts5.LOCID) LO5
     OUTER APPLY (SELECT * FROM @LOCTS6 lts6 WHERE lts1.LOCID = lts6.LOCID) LO6
     OUTER APPLY (SELECT * FROM @LOCTS7 lts7 WHERE lts1.LOCID = lts7.LOCID) LO7

1 Ответ

3 голосов
/ 04 июля 2019

Использование APPLY

select t.*, v.minlim
from t cross apply
     (select min(col) as minlim
      from (values (LIMITAMT),
                   (EQSITELIMAMT),
                   (EQCOMBINEDLIMAMT),
                   (HUSITELIMAMT),
                   (HUCOMBINEDLIMAMT),
                   (TOSITELIMAMT),
                   (TOCOMBINEDLIMAMT),
                   (FLSITELIMAMT),
                   (FLCOMBINEDLIMAMT),
                   (FRSITELIMAMT),
                   (FRCOMBINEDLIMAMT),
                   (TRSITELIMAMT),
                   (TRCOMBINEDLIMAMT)
            ) v(Col)
      where col <> 0
     ) v;
...