SQL -Case Statement / Может быть, L oop будет работать? - PullRequest
1 голос
/ 15 апреля 2020

Начинающий кодер здесь, поэтому любой совет очень ценится.

Отредактировано: у меня есть таблица с тысячами текущих проектов. Существует не менее 10 различных дат / этапов для каждого проекта (которые записываются как даты, следовательно, date1, date2 и т. Д.). Мне нужно создать вычисляемое поле, в котором в зависимости от максимальной даты для этого одного проекта (на основе ВСЕХ столбцов даты) я должен установить его на определенной стадии c в проекте (см. Столбец Фаза - это рассчитанное поле я пытаюсь произвести с моим кодом). Вот разбивка:

enter image description here

Не все даты на указанном этапе c будут доступны. Например, в проекте № 1 заполняется дата1, но не дата2 или дата3, и это означает, что проект все еще находится на этапе 1. Если дата2 или дата3 также заполнены, проект все равно будет находиться в Stage1, потому что даты4, дата5, дата6, дата7, дата8, дата9, дата10 - все равны нулю.

Поэтому я пишу регистр в выборке заявление, но оно становится немного запутанным. Вот что я подготовил для этапа 2:

SELECT *
    FROM datatable
    CASE WHEN date5 >= date4 
          AND date5>date3 
          AND date5>date2 
          AND date5>date1 
          AND date6=NULL 
          AND date7=NULL 
          AND date8=NULL 
          AND date9=NULL 
          AND date10=NULL 
     THEN 'Stage2'

И это только для этапа 2. Я не выписывал остальные этапы. У кого-нибудь есть более простой способ сделать это?

Спасибо!

1 Ответ

1 голос
/ 15 апреля 2020

Кажется, вы хотите установить сцену в соответствии с последним столбцом даты, установленным в строке. Поскольку первое совпадение в выражении CASE выигрывает, это будет:

SELECT t.*,
  CASE
    WHEN date10 IS NOT NULL THEN 'Stage5'
    WHEN date9 IS NOT NULL THEN 'Stage4'
    WHEN date8 IS NOT NULL THEN 'Stage4'
    WHEN date7 IS NOT NULL THEN 'Stage3'
    WHEN date6 IS NOT NULL THEN 'Stage3'
    WHEN date5 IS NOT NULL THEN 'Stage2'
    WHEN date4 IS NOT NULL THEN 'Stage2'
    WHEN date3 IS NOT NULL THEN 'Stage1'
    WHEN date2 IS NOT NULL THEN 'Stage1'
    WHEN date1 IS NOT NULL THEN 'Stage1'
    ELSE 'Stage0'
  END AS stage
FROM datatable t
ORDER BY project#;
...