Каков наилучший способ выбрать минимальное значение из нескольких столбцов и затем рассчитать их сумму? - PullRequest
1 голос
/ 09 мая 2019

Я пытаюсь: 1) выбрать минимальное значение между col_1, col_2 и col_3. 2) Рассчитать сумму минимальных значений на основе значения id_col.

Используя приведенную ниже таблицу примеров,Результат, который я ожидаю:

+--------+--------------+
| id_col | sum          | 
+--------+--------------+
|    123 | 523.99996667 |
+--------+--------------+

example_table

+--------+--------------+----------+---------+------+
| id_col | col_1        | col_2    | col_3   | id   |
+--------+--------------+----------+---------+------+
|    123 | 175.00000000 | 150.0000 |    NULL | 999  |
|    123 | 175.00000000 | 150.0000 |    NULL | 999  |
|    123 | 175.00000000 | 150.0000 |    NULL | 999  |
|    123 |  41.66666667 |  50.0000 |    NULL | 4444 |
|    123 |  50.00000000 | 100.0000 | 32.3333 | 5555 |
+--------+--------------+----------+---------+------+

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

select id_col,
SUM(CASE WHEN col_1 < col_2 AND col_1 < col_3 THEN col_1
            WHEN col_2 < col_1 AND col_2 < col_3 THEN col_2
            ELSE col_3 END) sum
from example_table
group by 1```

Ответы [ 3 ]

3 голосов
/ 09 мая 2019

Если ваша база данных равна mysql, вы можете использовать least()

select id_col,SUM(least(coalesce(col1,0),coalesce(col2,0),coalesce(col3,0)))
from tablename
group by id_col

ИЛИ

select id_col,
SUM(CASE WHEN coalesce(col_1,0) < coalesce(col_2,0) AND coalesce(col_1,0) < coalesce(col_3,0) THEN col_1
            WHEN oalesce(col_2,0) < oalesce(col_1,0) AND oalesce(col_2,0) < oalesce(col_3,0) THEN col_2
            ELSE oalesce(col_3,0) END) sum
from example_table
group by 1
1 голос
/ 09 мая 2019

Для SQL Server, этот следующий скрипт будет работать.Вы можете добавить столько столбцов, сколько вам нужно в списке CROSS APPLY

SELECT B.ID [id_col],SUM(B.least) [SUM]
FROM
(
    SELECT  A.ID,A.RN, MIN(T.CombinedValue) AS least FROM
    (
        SELECT ROW_NUMBER() OVER(PARTITION BY yt.ID ORDER BY ID) RN, * 
        FROM your_table yt
    ) A
    CROSS APPLY ( VALUES ( A.col1 ), ( A.col2 ), ( A.col3 )) AS T (CombinedValue)
    GROUP BY A.ID,A.RN
)B
GROUP BY B.ID
1 голос
/ 09 мая 2019

Просто альтернатива ответу @ fa06 (+1), вы можете сначала использовать подзапрос, чтобы объединить все значения NULL в ноль, а затем просто использовать свой текущий запрос дословно:

WITH cte AS (
    SELECT
        id,
        id_col,
        COALECSE(col_1, 0) AS col_1,
        COALECSE(col_2, 0) AS col_2,
        COALECSE(col_3, 0) AS col_3
    FROM example_table
)

SELECT
    id_col,
    SUM(CASE WHEN col_1 < col_2 AND col_1 < col_3 THEN col_1
             WHEN col_2 < col_1 AND col_2 < col_3 THEN col_2
             ELSE col_3 END) AS sum
FROM cte
GROUP BY id_col;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...