Оператор CASE, основанный на нескольких строках - PullRequest
0 голосов
/ 25 октября 2019

У меня есть запрос, который приводит к выводу ниже (этот вывод только для 1 servicelocation_id, но есть тысячи). Мне нужно создать оператор CASE, который будет смотреть на несколько строк для «Утилиты», чтобы определить вывод.

Если в какой-либо строке для конкретной «Утилиты» есть NULL «todate» (Твердые отходы, например) Я хочу создать столбец «Статус» со значением «Активный». Если все строки для определенной «Утилиты» имеют «todate», я хочу, чтобы значение было «Неактивно».

Я не могу сделать MAX для «fromdate», чтобы определить, является ли утилитаактивен или нет, потому что возможно, что строка с 'todate' имеет более недавнее 'fromdate', чем строка, у которой его нет.

enter image description here

Ответы [ 3 ]

1 голос
/ 25 октября 2019

Если вам нужна одна строка на servicelocation_id / utility, вам нужна агрегация:

select servicelocation_id, utility,
       (case when count(*) = count(to_date)
             then 'Inactive' else 'Active'
        end) as flag
from t
group by servicelocation_id, utility;

Если вы хотите сохранить исходные строки, это можно легко адаптировать для использования оконных функций вместоагрегация.

0 голосов
/ 25 октября 2019

Попробуйте поместить свой оператор case в подзапрос A, затем используйте подзапрос B, чтобы выбрать из A, используя Group By, которая принимает минимум статуса. Таким образом, если есть значение «Active», это будет значение, в противном случае «Inactive» будет значением.

Отредактировано для включения утилиты в группировку / объединение в соответствии с требованиями

    SELECT YT.servicelocation_id, YT.fromdate, YT.todate, YT.Utility, B.Status
    FROM YourTable YT
    LEFT JOIN 
    (--B subquery
        SELECT servicelocation_id, utility, min(Status) as Status
        FROM (--A subquery
                SELECT servicelocation_id, utility, CASE WHEN todate IS NULL THEN 'Active' ELSE 'Inactive' END as Status
             ) A
        GROUP BY servicelocation_id, utility
    ) B ON YT.servicelocation_id = B.servicelocation_id and YT.utility = B.utility
    --Optional WHERE clause
    WHERE YT.YourField = 'YourCriteria'

На основании данных, указанных для servicelocation_id 84061, все они будут иметь статус «Активный», поскольку каждая утилита имеет хотя бы одно значение, где todate равно NULL.

0 голосов
/ 25 октября 2019

Вы можете сделать CASE WHEN EXISTS() с коррелированным подзапросом в функции EXISTS().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...