У меня есть таблица с этими 6 строками.

code | type_id | status | type
-----+--------+--------+-------
123  | 123456 | UPLOAD | PDF
123  | 456789 | UPLOAD | DOC
321  | 654321 | UPLOAD | PDF
321  | 897321 | DONE   | DOC
456  | 999888 | PEND   | PDF
456  | 777666 | UPLOAD | DOC

И я хочу получить результат, как показано ниже, с помощью

Case1 получить type_id с UPLOAD UPLOAD под тем же кодом для PDF и doc

Case2 получить type_id с UPLOAD только с UPLOAD DONE под тем же кодом для PDF и doc

Case3 не показывать type_id при PEND и сбое под одним и тем же кодом для PDF и doc

code | type_id1 | type_id2
-----+----------+---------
123  | 123456   | 456789
321  | 654321   | null
null | null     | null   <for 456 dont show result

Как я могу обработать их с помощью sql, чтобы показать результат?

Большое спасибо ~

0
fizz 24 Окт 2019 в 11:21

1 ответ

Вы можете добиться этого, LEFT JOIN-соединив таблицу с самой собой:

SELECT t1.code, t1.type_id AS type_id1, t2.type_id AS type_id2
FROM your_table t1
LEFT JOIN your_table t2 
   ON t1.code = t2.code
   AND t2.type = 'DOC'
   AND t2.status = 'UPLOAD'
WHERE t1.type = 'PDF' AND t1.status = 'UPLOAD'

Это возьмет все строки с PDF и UPLOAD и "добавит" значение type_id2, только если есть строка с соответствующими code, type = DOC и status = UPLOAD

Для данных, которые вы предоставили, ожидаемый результат должен быть

code | type_id1 | type_id2
-----+----------+---------
123  | 123456   | 456789
321  | 654321   | null

Вы можете попробовать здесь

=== Версия 2 ============================================ ==================

Вот обновленная версия, основанная на моей интерпретации ваших комментариев:

SELECT t1.code, 
    CASE 
      WHEN t1.status = 'UPLOAD' AND t2.status != 'PEND' 
      THEN t1.type_id 
      ELSE null 
    END AS type_id1,
    CASE 
      WHEN t2.status = 'UPLOAD' AND t1.status != 'PEND' 
      THEN t2.type_id 
      ELSE null 
    END AS type_id2
FROM your_table t1
LEFT JOIN your_table t2 
   ON t1.code = t2.code
   AND t2.type = 'DOC'
WHERE t1.type = 'PDF'

Вы можете попробовать это здесь

Если вам не нужны строки с code | null | null, вы можете удалить оба AND t#.status != 'PEND' из предложений WHEN и добавить в самом конце запроса: AND t1.status != 'PEND' AND t2.status != 'PEND', например второй запрос в скрипке.

0
Pepper 24 Окт 2019 в 13:19
Спасибо за ваш ответ! оно работает! а если 456 | 999888 | ОТЛОЖИТЬ | PDF 456 | 777666 | ЗАГРУЗИТЬ | ДОКТОР
 – 
fizz
24 Окт 2019 в 12:23
Спасибо за ваш ответ! Оно работает! Но для статуса с типом документа можно поменять местами ~ PDF на DONE, DOC на PEND. Если в этом случае sql не может показать правильный результат ~ не могли бы вы научить меня, как это сделать?
 – 
fizz
24 Окт 2019 в 12:47
Можете ли вы добавить эти примеры и их желаемый результат в свой вопрос? например, если PDF ВЫПОЛНЕН, а DOC ЗАГРУЖЕН, должен ли type_id "doc" быть записан в type_id1 или type_id2? а для 456 вы все еще хотите, чтобы строка отображала 456 | null | null?
 – 
Pepper
24 Окт 2019 в 12:58
Попробуйте добавить ожидаемый набор результатов, отредактировав свой вопрос (табличную форму), чтобы сообщество могло помочь, а не задавать много сомнений.
 – 
James
24 Окт 2019 в 15:11