Оператор SQL, который оценивает несколько столбцов и возвращает столбец, который соответствует критериям значения? - PullRequest
0 голосов
/ 30 января 2019

Спасибо за разъяснения по поводу публикации.Я пытался сделать это простым, но вот некоторые дополнительные детали / глубины для того, что я пытаюсь достичь.

По сути, я хочу провести поиск по 3 различным полям и сначала определить программу «Бакалавриат» (если она существует).Если не существует действительной программы бакалавриата, я хочу найти программу «Выпускник» (если она существует).Если никакой аспирантуры не существует, то я хочу найти «докторскую» программу.

У меня есть 6 столбцов, с которыми я пытаюсь работать.Вот пример:

Program1    Program2    Program3    AcadLevel1  AcadLevel2  AcadLevel3
DNP.FNP     GR          NULL            DO          GR          NULL
MS.ACT      BS.BUAN     NULL            GR          UG          NULL
DNP.FNP     GR          NULL            DO          GR          NULL
EDD.EDLC    GR          NULL            DO          GR          NULL
MAED.EDL    EDD.EDLC    GR              GR          DO          GR
DNP.FNP     GR          UG              DO          GR          UG

Я хочу игнорировать все значения NULL и игнорировать любые "GR", "UG" или "DO" в любом из полей Program1, 2 и 3, какони не являются действительными идентификаторами программ.Их следует использовать только для определения академического уровня программы.

Конечная цель - определить одну программу.Если есть программа бакалавриата, это должна быть эта программа.Если нет программы бакалавриата, то это должна быть программа магистратуры.Если нет аспирантуры, докторантура.Если есть две программы бакалавриата, мне все равно, какая из них включена.И точно так же, если есть 2 программы для выпускников (и нет программ для студентов), то одной из них будет достаточно.

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

Еще раз спасибо за любую помощь / руководство и извините за ранее путаницу.

###################### Обновление

Вотпример того, что я пытаюсь выполнить:

CASE WHEN ISNULL(Program2,'')='' THEN Program1
       WHEN (AcadLevel1 = 'UG' and Program1 NOT IN ('UG','SP','GR','DO')) THEN Program1
       WHEN (AcadLevel1 = 'UG' and Program1 IN ('UG','SP','GR','DO')) THEN
        CASE WHEN ISNULL(Program2,'')='' THEN Program1 
             WHEN Program2 IN ('UG','SP','GR','DO') AND ISNULL(Program3,'')='' THEN Program2
             WHEN Program2 IN ('UG','SP','GR','DO') AND ISNULL(Program3,'')<>'' THEN Program3
             WHEN Program2 IN ('UG','SP','GR','DO') AND Program3 IN ('UG','SP','GR','DO') THEN Program1
             WHEN Program2 NOT IN ('UG','SP','GR','DO') AND ISNULL(Program3,'')='' THEN Program2
             WHEN Program2 NOT IN ('UG','SP','GR','DO') AND AcadLevel2 = 'UG' THEN Program2
             WHEN Program2 NOT IN ('UG','SP','GR','DO') AND AcadLevel3 = 'UG' AND Program3 NOT IN ('UG','SP','GR','DO') THEN Program3
             ELSE 'Other'
        END
 ELSE 'Other2' 
END AS 'Program_New'

Мне трудно анализировать все возможные сценарии между всеми полями, чтобы получить правильное значение программы.И хотя я могу продолжать писать дополнительные операторы CASE до тех пор, пока у меня не будет «других» кодов ошибок, я все равно не буду знать, исправят ли они все возможные сценарии.

Я надеялся на более всеобъемлющее и простое решение, но, возможно, его нет ...

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Вам необходимо использовать case для проверки каждого столбца и like для проверки, содержит ли столбец значение MBA

select
    case
      when program1 like '%MBA%' then program1
      when program2 like '%MBA%' then program2
      when program3 like '%MBA%' then program3
    end col 
from tablename

См. Демонстрационную версию

0 голосов
/ 30 января 2019

Вы ищете что-то подобное?

DECLARE @table TABLE (id INT, program1 VARCHAR(10), program2 VARCHAR(10), program3 VARCHAR(10));
INSERT INTO @table 
SELECT 1, 'MBA', 'ABM', 'XYZ'
UNION ALL
SELECT 2, 'QWE', 'MBA', 'ABM';

SELECT
    id,
    CASE
        WHEN program1 = 'MBA' THEN 'program1'
        WHEN program2 = 'MBA' THEN 'program2'
        WHEN program3 = 'MBA' THEN 'program3'
        ELSE 'not found'
    END AS result
FROM
    @table;

Результаты:

id  result
1   program1
2   program2

Итак, вы хотите взять результаты из первого запроса, а затем передать их ввторой запрос, где вы делаете что-то еще с результатами.Да, это возможно, но я действительно не уверен, куда вы идете с этим, например:

DECLARE @table TABLE (id INT, program1 VARCHAR(10), program2 VARCHAR(10), program3 VARCHAR(10));
INSERT INTO @table 
SELECT 1, 'MBA1', 'ABM', 'XYZ'
UNION ALL
SELECT 2, 'QWE', 'MBA2', 'ABM';

WITH x AS (
    SELECT
        id,
        CASE
            WHEN program1 LIKE '%MBA%' THEN 'program1'
            WHEN program2 LIKE '%MBA%' THEN 'program2'
            WHEN program3 LIKE '%MBA%' THEN 'program3'
            ELSE 'not found'
        END AS result
    FROM
        @table)
SELECT
    *,
    CASE
        WHEN result = 'program1' THEN t.program1
        WHEN result = 'program2' THEN t.program2
        WHEN result = 'program3' THEN t.program3
    END AS not_sure_where_you_are_going_with_this
FROM
    x
    INNER JOIN @table t ON t.id = x.id;

Мой пример - мусор, кстати, так как вы можете легко сделать все это в одном запросе.Поэтому я думаю, что вам нужно предоставить некоторые данные / ожидаемые результаты, чтобы получить лучший ответ?

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