За последние 24 часа нас посетили 18403 программиста и 1619 роботов. Сейчас ищут 1100 программистов ...

Подскажите насколько корректно такое условие.

Тема в разделе "MSSQL", создана пользователем Artur_hopf, 18 ноя 2019.

  1. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    Добрый день. Идея такая - если нет данных за промежуток даты, записать 0.

    Упрощенный запрос:
    PHP:
    1. SELECT SUM(RF.[Status])
    2. FROM table AS RF
    3. -- прочие LEFT JOIN
    4. WHERE RF.[test] = 1
    5. AND (RF.[Date] BETWEEN STD.[ProductionStart] AND STD.[ProductionEnd] OR RF.[Status] = 0)
    То есть именно вот такая запись означает - если нет данных за промежуток даты, записать 0?
    PHP:
    1. 'AND (RF.[Date] BETWEEN STD.[ProductionStart] AND STD.[ProductionEnd] OR RF.[Status] = 0)'
    Работает это именно так, какого то хрена. Все верно или я где то ошибаюсь?
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    И (RF.[Date] находится в заданном интервале ИЛИ RF.[Status] равно нулю, вне зависимости от даты)
     
  3. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @Sail хорошо, спасибо. таким не пользовался раньше. Всегда думал что уж если OR то должно быть другое условие.
     
  4. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    Если OR прокатило в первом варианте, то если не использовать SUM:
    PHP:
    1. SELECT RF.[Duration]
    2. -- FROM ...
    3. WHERE ST.[TaskDate] = '2019-11-20'
    4. AND ST.[ShiftType] = 0
    5. AND (RF.[Date] BETWEEN STD.[ProductionStart] AND STD.[ProductionEnd] OR RF.[Duration] = 0)
    6. AND STD.[TaskStatus] = 1
    7. ORDER BY RF.[Date] DESC
    То ответ будет пустым count = 0
    Подскажите как в данном sql запросе вывести [Duration] = 0, если за выборкой BETWEEN нет данных?
     
  5. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Подробнее, раскройте пожалуйста, что подразумевается в этой фразе... :)

    В приведённом запросе в выборку попадут все записи, у которых RF.[Duration] равно 0 И у которых:
    ST.[TaskDate]='2019-11-20'
    ST.[ShiftType]=0
    STD.[TaskStatus]=1
     
  6. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @Sail а если в этой выборке вообще нет данных по такому условию? нужно в результате получить RF.[Duration] = 0
    --- Добавлено ---
    у меня сейчас на стороне php этот ноль:
    PHP:
    1. if(count($result) !== 0){
    2.                 return $result;
    3.             }else{
    4.                 return 0;
    5.             }
    а хотелось бы на стороне sql
     
  7. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Код (Text):
    1. select case when count(1)>0 then RF.[Duration] else 0 end as `ALIAS` from...
    ALIAS, соответственно - псевдоним... подставь тот, что нужен.
     
    Artur_hopf нравится это.
  8. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    спасибо, попробую как нибудь