Исправить заголовок столбца, который зависит от других флагов? - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь заполнить столбец заголовка в зависимости от других флагов, и я использую оператор case для достижения этой цели. К сожалению, я столкнулся с проблемой с результатом. Заголовок должен быть одинаковым для каждого основного объекта независимо от флажка детализации.

Код:

SELECT Primary_Key, Detail_Flag, Flag_A, Flag_B,
  CASE WHEN Detail_Flag=0 THEN
    CASE WHEN Flag_A=1 AND Flag_B=1 THEN 1 
    ELSE 0 END 
  END AS IsCommercialFlag,

  CASE WHEN Flag_A=1 AND Flag_B=1 THEN 'Yes'
  ELSE 'No'
  END
  AS IsCommercialFlagCaption

FROM TableFlags 
WHERE Primary_Key IN (123, 456)
ORDER BY Primary_Key, Detail_Flag

Фактический результат:

enter image description here

Ожидаемый результат:

enter image description here

Ответы [ 3 ]

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

Вам, кажется, нужны оконные функции:

SELECT Primary_Key, Detail_Flag, Flag_A, Flag_B,
       (CASE WHEN Detail_Flag = 0 AND Flag_A = 1 AND Flag_B = 1
             THEN 1
             WHEN Detail_Flag = 0
             THEN 0 
        END) AS IsCommercialFlag,
       (CASE WHEN MAX(Flag_A) OVER (PARTITION BY Primary_Key) = 1 AND
                  MAX(Flag_B) OVER (PARTITION BY Primary_Key) = 1
             THEN 'Yes'
             ELSE 'No'
        END) AS IsCommercialFlagCaption
FROM TableFlags 
WHERE Primary_Key IN (123, 456)
ORDER BY Primary_Key, Detail_Flag;

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

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

Вот ответ, который я искал.

ВЫБРАТЬ Primary_Key, Detail_Flag, Flag_A, Flag_B, CASE WHEN Detail_Flag = 0, ТОГДА СЛУЧАЙ, КОГДА Flag_A = 1 И Flag_B = 1, THEN 1, ELSE 0 КОНЕЦ КАК IsCommercialFlag,

СЛУЧАЙ, КОГДА СУММА (Flag_A) over (Упорядочить по PrimaryKey) = 1 И СУММА (Flag_B) over (Упорядочить по PrimaryKey) = 1, ЗАТЕМ «Да», ELSE «Нет». END AS IsCommercialFlagCaption

ОТ TableFlags ГДЕ Primary_Key IN (123, 456) ORDERBY Primary_Key, Detail_Flag

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

Кажется, вам просто нужна обработка NULL. Учитывая, что вы в настоящее время используете ORACLE в качестве продукта СУБД, вы можете попробовать выполнить следующий запрос:

SELECT 
 Primary_Key,
 Detail_Flag, 
 Flag_A, 
 Flag_B,
  CASE WHEN Detail_Flag=0 THEN
    CASE WHEN NVL(Flag_A, 1) = 1 AND NVL(Flag_B, 1) = 1 THEN 1 
    ELSE 0 END 
  END AS IsCommercialFlag,    
  CASE WHEN NVL(Flag_A, 1) = 1 AND NVL(Flag_B, 1) = 1 THEN 'Yes'
  ELSE 'No'
  END
  AS IsCommercialFlagCaption

FROM TableFlags 
WHERE Primary_Key IN (123, 456)
ORDER BY Primary_Key, Detail_Flag

Если вы используете MySQL, просто замените NVL на IFNULL, для пользователя SQL SERVER ISNULL.

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