У меня сложный запрос. Я должен сделать отчет в PHP, как на картинке ниже.
Part summarized yield
должен быть заполнен поперек расчета.
Как я объясняю в столбце формулы, значение в part summarized yield
получил из расчета между location yield
а также part summarized yield
,
(См. Эту формулу)
Как сделать этот расчет в отчете PHP?
Я уже пытался использовать курсор, но он все еще не работал.
Вот мой расчет курсора:
--In PHP file, i make query to insert data first to table tyield_summary
--Cursor to input yield_summary
Declare @nourut varchar(2), @maxnourut varchar(2), @bpnum varchar(20), @pnum varchar(20), @curnourut varchar(2), @psum decimal(18,2), @ysum decimal(18,2)
DECLARE StockCursor CURSOR
FOR
select no_urut, part_number, Part_Summary
from tyield_summary
where no_urut<>'99'
order by part_number desc, no_urut asc
set @bpnum=''
OPEN StockCursor
FETCH NEXT FROM StockCursor INTO @nourut, @pnum, @psum
WHILE @@FETCH_STATUS=0
BEGIN
if @bpnum=@pnum
begin
select top 1 @curnourut=no_urut
from tyield_summary
where part_number=@pnum
and no_urut<@nourut
order by no_urut desc
set @bpnum=@pnum
select @maxnourut = max(no_urut) from tyield_summary
where part_number=@pnum
update tyield_summary
set yield_summary = case when Part_Summary=0 then @psum else (Part_Summary*@psum)/100 end
where part_number=@pnum
and no_urut=@curnourut
end
else
begin
set @bpnum=@pnum
end
FETCH NEXT FROM StockCursor INTO @nourut, @pnum, @psum
END
CLOSE StockCursor
DEALLOCATE StockCursor
Мне нужно заполнить part_summary
поле с использованием формулы, которую я показываю в Excel.
В формуле шоу расчет с использованием кросс-поля.
Вот как вы можете это сделать (без неприятных курсоров).
Просто используйте номер строки над вашими критериями упорядочения / агрегации, чтобы найти следующую строку,
осталось соединить каждую строку со следующей (не забывая критерии агрегации), и все готово.
Давайте рассмотрим пример (и вот как вы правильно публикуете структуру таблицы):
create table Lazydude
(
Partno varchar(20) not null
,Seq int not null
,[Value] float not null
)
GO
insert into Lazydude (Partno, Seq, [Value])
values
('AAA', 1, 77.7)
,('BBB', 0, 2)
,('BBB', 3, 3)
,('BBB', 9, 5)
,('CCC', 1, 33.3)
,('CCC', 2, 33.3)
GO
и выбрать, используя номер строки и использовать результат в самостоятельном соединении
with Temp as(
select Partno, Seq, [Value]
,ROW_NUMBER() OVER(ORDER BY Partno, Seq) AS [Row]
from Lazydude
)
select t0.Partno, t0.Seq, t0.[Value], t0.[Row]
, t1.row as [Next Row], t1.[Value] as [Next Value]
, case when t1.row is null
then t0.[Value]
else t0.Value * t1.Value
end as [The Calculation]
from Temp t0
left join Temp t1 on t1.[Row] = t0.[Row] + 1 and t1.Partno = t0.Partno
Вы можете увидеть результаты в SQL Fiddle
Partno Seq Value Row Next Row Next Value The Calculation
AAA 1 77.7 1 (null) (null) 77.7
BBB 0 2 2 3 3 6
BBB 3 3 3 4 5 15
BBB 9 5 4 (null) (null) 5
CCC 1 33.3 5 6 33.3 1108.8899999999999
CCC 2 33.3 6 (null) (null) 33.3
Других решений пока нет …