Использование case-when для сложного запроса при нескольких условиях - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть данные, показанные ниже:

    ID_LIFTING | ITEM | DATE
    ---------------------
    1101       | 6    | 2020-02-01
    1101       | 6    | 2020-02-02
    1101       | 6    | 2020-02-03
    1101       | 7    | 2020-02-01
    1101       | 7    | 2020-02-02
    1101       | 7    | 2020-02-03
    1102       | 6    | 2020-02-04
    1102       | 6    | 2020-02-04
    1102       | 7    | 2020-02-04
    1102       | 7    | 2020-02-04

То, что я хочу, это , под аналогичными ID_DATA и ITEM , там будет быть одним столбцом, показывающим объединенный диапазон дат в виде строки ' MIN (дата) - MAX (дата) '. Но если при аналогичной ID_DATA дата похожа, она будет показывать только ДАТА без диапазона.

Обратите внимание, что может быть более 2 строк ДАТА для одного ID_DATA . Я надеюсь использовать case-when.

После ожидаемого результата :

    ID_LIFTING | ITEM | DATE
    ---------------------
    1101       | 6    | 2020-02-01 - 2020-02-03
    1101       | 7    | 2020-02-01 - 2020-02-03
    1102       | 6    | 2020-02-04
    1102       | 7    | 2020-02-04

Ниже приведен мой запрос. Мой запрос все еще неправильный, я не понимаю, где поставить правильный запрос для моего ожидаемого результата :( (это для ALD_DATE ). Обратите внимание, что у меня есть много объединений ниже, чтобы получить нужные мне данные, как показано выше. ID_LIFTING есть после параметра таблицы D .

    SELECT DISTINCT ...
            )
        ,ALD_DATE = (SELECT CASE WHEN MIN(DATE) = MAX(DATE) THEN CAST(MIN(DATE) AS CHAR)
            ELSE CONCAT(MIN(DATE), ' - ', MAX(DATE)) 
       END AS DATE
FROM data
GROUP BY ID_LIFTING, ITEM
ORDER BY ID_LIFTING),

    FROM MYTABLE A
    LEFT JOIN ...;

1 Ответ

1 голос
/ 07 февраля 2020

Вы можете использовать выражение CASE, чтобы проверить, совпадают ли значения MIN и MAX для DATE. Если нет, выведите диапазон, в противном случае выведите единственное значение:

SELECT ID_LIFTING, ITEM,
       CASE WHEN MIN(DATE) = MAX(DATE) THEN CAST(MIN(DATE) AS CHAR)
            ELSE CONCAT(MIN(DATE), ' - ', MAX(DATE)) 
       END AS DATE
FROM data
GROUP BY ID_LIFTING, ITEM
ORDER BY ID_LIFTING

Вывод (для данных примера):

ID_LIFTING  ITEM    DATE
1101        6       2020-02-01 - 2020-02-03
1101        7       2020-02-01 - 2020-02-03
1102        6       2020-02-04
1102        7       2020-02-04 

Демонстрация по SQLFiddle

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

ALD_DATE = CASE WHEN MIN(DATE) OVER (PARTITION BY ID_LIFTING, ITEM) = MAX(DATE) OVER (PARTITION BY ID_LIFTING, ITEM) THEN CAST(MIN(DATE) OVER (PARTITION BY ID_LIFTING, ITEM) AS CHAR) 
                ELSE CONCAT(MIN(DATE) OVER (PARTITION BY ID_LIFTING, ITEM), ' - ', MAX(DATE) OVER (PARTITION BY ID_LIFTING, ITEM)) 
           END
...