2014-12-30 4 views
0

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

соглашение Старт, соглашениеEnd и plantType принадлежат tbl_p. Я попытался переместить все в ON-часть, но затем включены другие строки, которые не должны быть там, а также еще не вычислять недостающие значения. В текущем примере отсутствующие строки включены в набор результатов, но поля hour00_01, hour01_02, hour02_03 остаются пустыми, поскольку они не вычисляются. Расчет для этих столбцов должен быть таким, чтобы, если hour00_01 для id 1 равен 1, hour00_01 для id 2 равен 2, а hour00_01 для id 3 - null, тогда id hour00_01 для id 3 должен быть 3 (сумма id 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 

ответ

0

Проблема заключается в вашей статье 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 
... 
+0

agreementStart, agreementEnd и plantType принадлежат tbl_p. Я попытался переместить все в ON-часть, но затем включены другие строки, которые не должны быть там, а также еще не вычислять недостающие значения. В текущем примере отсутствующие строки включены в набор результатов, но поля hour00_01, hour01_02, hour02_03 остаются пустыми, поскольку они не вычисляются. Расчет для этих столбцов должен быть таким, чтобы, если hour00_01 для id 1 равен 1, hour00_01 для id 2 равен 2, а hour00_01 для id 3 - null, тогда id hour00_01 для id 3 должен быть 3 (сумма id 1 и 2) , – mediasurface