В запросе SQL я что-то вычисляю. Этому исчислению нужна таблица (DurationsLog
), которая не должна быть пустой (таблица должна содержать строки).Условно выбор столбца (странные результаты)
Так что я пытаюсь обработать случай, когда эта таблица пуста.
Итак, я попытался обработать его с помощью CASE в select, но он не работает (получил 0 строк, когда DurationsLog
пуст).
Вот запрос:
SELECT
o.Maint,
CASE
WHEN EXISTS(SELECT * FROM DurationsLog)
THEN DATEADD(day, (p.CycleDuration - (c.TotalRotationCounter - o.LastActionCounter))/AVG(d.RotationDuration), GetDate())
ELSE 'CALCUL IMPOSSIBLE'
END AS CalculProchaineDate
FROM
dbo.Operations o
INNER JOIN
dbo.Periods As p ON o.PeriodId = p.Id,
dbo.Counters c,
dbo.DurationsLog d
WHERE
p.CycleDuration>0
GROUP BY
o.Maint, p.CycleDuration, c.TotalRotationCounter, o.LastActionCounter
NB: не DurationsLog
уже не соединения с другой таблицей
NB-бис: Когда DurationsLog
содержит строки, он работает нормально
NB 3: система SQL является Microsoft SQL Server 2008
Редактировать: S кажется, что я не очень хорошо объяснил свою проблему, я подробно расскажу об этом:
Таблица dbo.Operations содержит информацию об обслуживании. Его основным ключом является «Maint» и он содержит внешний ключ «PeriodId» на таблице dbo.Periods.
dbo.Periods таблица содержит Id в качестве первичного ключа и поля «CycleDuration», который я использую для исчисления
dbo.Counters не имеет первичный ключ. Он содержит общие счетчики использования машины (сколько часов он вращается, производит ...), эта таблица всегда содержит только одну строку
dbo.DurationsLog содержит первичный ключ, который является датой. Эта таблица хранит, сколько времени наша машина вращалась и производилась сегодня. Так эта таблица содержит один ряд/день
«CycleDuration» из Периодов магазинов, сколько времени (в часах) между двумя операциями (примером: нам нужно очистить й каждые 4000 часов, CycleDuration будет 4000)
Мы сохраняем таблицу Operations в последний раз, когда мы выполнили эту операцию. Поэтому я оцениваю, когда будет выполняться следующая операция.
Вот почему я рассчитываю: CycleDuration - (Счетчик последнего времени, когда я выполнял операцию)/Средняя продолжительность в день. При этом я могу оценить, когда будут выполняться следующие операции.
[Плохие привычки пинать: использование старого стиля JOIN и] (http://sqlblog.com/blogs/aaron_bertrand/archive/ 2009/10/08/BAD-привычки к ножным, используя старый стиль-соединения.aspx) - используйте правильный ANSI - ** 92 ** Стандартный 'INNER JOIN' /' LEFT OUTER JOIN' синтаксис (и, безусловно, ** не смешивайте ** два стиля!) –
@marc_s вы могли бы быть более конкретными, как бы вы переписывали соединения в этом запросе? Насколько я знаю, я использую INNER JOIN (таблицы Counters & DurationsLog не имеют объединений с другими таблицами) –
Вы ** не ** используете правильную 'INNER JOIN' для таблиц' dbo.Counters c' и 'dbo .DurationsLog d' .... если у вас «нет соединений», то используйте «CROSS JOIN» или «FULL OUTER JOIN» для соответствия SQL-92. –