Вычислить значения для отсутствующих строк

У меня есть SQL-запрос, который извлекает прогнозы в день. Если для данного «LP» отсутствует прогноз, я хотел бы рассчитать его на основе других прогнозов. Однако с приведенным ниже кодом он не рассчитывает прогнозы, когда они отсутствуют.

соглашениеStart, соглашениеEnd и plantType принадлежат tbl_p. Я попытался переместить все в ON-часть, но тогда включены другие строки, которых там быть не должно, а также все еще нет расчета отсутствующих значений. В текущем примере отсутствующие строки включены в набор результатов, но поля hour00_01, hour01_02, hour02_03 остаются пустыми, поскольку они не вычисляются. Вычисление для этих столбцов должно быть таким, что если hour00_01 для идентификатора 1 равен 1, hour00_01 для идентификатора 2 равен 2, а hour00_01 для идентификатора 3 равен нулю, то идентификатор hour00_01 для идентификатора 3 должен быть равен 3 (сумма идентификаторов 1 и 2) .

Может ли кто-нибудь указать мне в правильном направлении здесь:

declare @startDt date = '2014-12-19' declare @endDt date = '2014-12-19' ; with AllDates as 
( select @startDt as dt union all select dateadd(day, 1, dt) 
from AllDates where dateadd(day, 1, dt) <= @endDt ) 
select dt, m.date, p.lp, p.electricityArea, maxCapacity, SUM(maxCapacity) as c, p.netArea, 
CASE hour00_01 WHEN null THEN maxCapacity*(sum(hour00_01)/sum(maxCapacity)) ELSE hour00_01 END hour00_01, 
CASE hour01_02 WHEN null THEN maxCapacity*(sum(hour01_02)/sum(maxCapacity)) ELSE hour01_02 END hour01_02,
CASE hour02_03 WHEN null THEN maxCapacity*(sum(hour02_03)/sum(maxCapacity)) ELSE hour02_03 END hour02_03
from AllDates ad cross join tbl_p p LEFT JOIN tbl_m m
on p.lp = m.lp and m.date = ad.dt and m.inputType = 'TYPE' where p.plantType = '2' AND (agreementStart <= '2014-12-19' AND agreementEnd >= '2014-12-19')
   GROUP BY 
      ad.dt,
      m.date, 
      p.lp, 
      p.electricityArea, 
      maxCapacity, 
      p.netArea, 
      p.electricityArea, 
      hour00_01, hour01_02, hour02_03

person mediasurface    schedule 30.12.2014    source источник


Ответы (1)


Проблема в вашем предложении WHERE. Неясно, к какой таблице принадлежат ваши столбцы agreementStart и agreementEnd, но поскольку у вас есть критерии для этих столбцов и столбца plantType, вы отклоняете любые столбцы, которые являются NULL (т.е. не совпадают в LEFT JOIN). Поэтому рассмотрите возможность переноса всех ваших WHERE-критериев в ON-часть соединения:

. . .
from AllDates ad cross join tbl_p p LEFT JOIN tbl_m m
on p.lp = m.lp and m.date = ad.dt and m.inputType = 'TYPE' AND p.plantType = '2' AND (agreementStart <= '2014-12-19' AND agreementEnd >= '2014-12-19')
GROUP BY 
...
person Dan    schedule 30.12.2014
comment
соглашениеStart, соглашениеEnd и plantType принадлежат tbl_p. Я попытался переместить все в ON-часть, но тогда включены другие строки, которых там быть не должно, а также все еще нет расчета отсутствующих значений. В текущем примере отсутствующие строки включены в набор результатов, но поля hour00_01, hour01_02, hour02_03 остаются пустыми, поскольку они не вычисляются. Вычисление для этих столбцов должно быть таким, что если hour00_01 для идентификатора 1 равен 1, hour00_01 для идентификатора 2 равен 2, а hour00_01 для идентификатора 3 равен нулю, то идентификатор hour00_01 для идентификатора 3 должен быть равен 3 (сумма идентификаторов 1 и 2) . - person mediasurface; 31.12.2014