Перекрестный расчет в SQL Server

У меня сложный запрос. Я должен сделать отчет в PHP, как на картинке ниже.
Part summarized yield должен быть заполнен поперек расчета.
Как я объясняю в столбце формулы, значение в part summarized yield получил из расчета между location yield а также part summarized yield,
(См. Эту формулу)

Пример отчета Excel

Как сделать этот расчет в отчете 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.
В формуле шоу расчет с использованием кросс-поля.

1

Решение

Вот как вы можете это сделать (без неприятных курсоров).
Просто используйте номер строки над вашими критериями упорядочения / агрегации, чтобы найти следующую строку,
осталось соединить каждую строку со следующей (не забывая критерии агрегации), и все готово.

Давайте рассмотрим пример (и вот как вы правильно публикуете структуру таблицы):

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
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]