Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 XP для расчета цены  [new]
Zorx
Member

Откуда:
Сообщений: 15
Вот такой изврат... можно ли быстрее,проще... и как?
Можно ли все это в селекте и без апдейтов?


DECLARE @Kurs real,@nds real,@num char(20),@price money

set @Kurs=(seLECT Value FROM LV WHERE Name='KursEtU')
set @nds=(seLECT Value/100 FROM LV WHERE Name='NDS')

SELECT o.Type,o.Eng_name,o.Perevod,o.Cat_number,
o.VesKg,
[Ind_price]=(CASE
when o.Ind_priceEU>0 then o.Ind_priceEU*@kurs
when o.Ind_priceUS>0 then o.Ind_priceUS
end),
[Dist_price]=(CASE
when o.Dist_priceEU>0 then o.Dist_priceEU*@kurs
when o.Dist_priceUS>0 then o.Dist_priceUS
end),
CAST('' as money) [PriceSPB],
o.Poshlina,
CAST('' as money) [Poslin],
CAST('' as money) [NDS],
CAST('' as money) [Pricenal],
CAST('' as money) [DostP],
CAST('' as money) [Doxod],
CAST('' as money) [Price],
s.value/100 [Skidka],
ROUND(d.value,4) [Dost],
CAST(t.value as real)/100 [TypeD],
CAST(p.value as real)/100 [Posh] INTO #Z
FROM Oborud o, Skidki s, Dost d,Types t, Poshlin p
WHERE o.Skidka=s.Name
and o.dost=d.Name
and o.Type=t.Name
and o.Poshlina=p.Name

Update #Z set PriceSPB=Dist_price-(Dist_price*Skidka)
Update #Z set Poslin=(PriceSPB*Posh)
Update #Z set NDS=(PriceSPB+Poslin)*@NDS
Update #Z set Pricenal=PriceSPB+Poslin+NDS
Update #Z set DostP=((VesKg*Dost)*(1+Posh))*(1+@NDS)
Update #Z set Doxod=(DostP+Pricenal)*TypeD
Update #Z set Price=DostP+Pricenal+Doxod
Select * from #Z
Drop table #Z
19 фев 03, 14:03    [132150]     Ответить | Цитировать Сообщить модератору
 Re: XP для расчета цены  [new]
Glory
Member

Откуда:
Сообщений: 104760
Можно, если создать таблицу с вычисляемыми полями
19 фев 03, 14:23    [132178]     Ответить | Цитировать Сообщить модератору
 Re: XP для расчета цены  [new]
Zorx
Member

Откуда:
Сообщений: 15
Но так же сделать нельзя...
SELECT o.A,o.B,[С]=o.A+o.B,[Z]=C*o.D From oborud o


Можно конечно раскрыть выражение...
SELECT o.A,o.B,[С]=o.A+o.B,[Z]=(o.A+o.B)*o.D From oborud o


Но при достаточно длинной цепочке будет отстой.. =(
Да и пересчитывать уже посчитанное значение не есть гуд...
19 фев 03, 14:57    [132229]     Ответить | Цитировать Сообщить модератору
 Re: XP для расчета цены  [new]
Glory
Member

Откуда:
Сообщений: 104760
Таблицы можно создавать и с помощью CREATE TABLE ...
19 фев 03, 15:02    [132238]     Ответить | Цитировать Сообщить модератору
 Re: XP для расчета цены  [new]
Glory
Member

Откуда:
Сообщений: 104760
Да, ошибся - вычисляемое поле из на основе другого вычисляемого поля не создать.
Если не нравяться Update-ы, то тогда используйте вложенные запросы. Правда от цепочки преобразований вас это не избавит
19 фев 03, 20:25    [132583]     Ответить | Цитировать Сообщить модератору
 Re: XP для расчета цены  [new]
sparrow
Member

Откуда: Россия, Красноярск.
Сообщений: 21759
Попробу цепочку VIEW создать.
20 фев 03, 08:42    [132705]     Ответить | Цитировать Сообщить модератору
 Re: XP для расчета цены  [new]
Zorx
Member

Откуда:
Сообщений: 15
Сделал так: добавил переменных и сократил до одного апдейта..
Стало гораздо быстрее

DECLARE @Kurs real,@nds real,@num char(20),@priceSPB money,

@Poslin money,@NDSS money,@Pricenal money,@DostP money,@Doxod money,@price money
set @num='K1522-2'/*передаем в процедуру*/
set @Kurs=(seLECT Value FROM LV WHERE Name='KursEtU')
set @nds=(seLECT Value/100 FROM LV WHERE Name='NDS')

SELECT o.Type,o.Eng_name,o.Perevod,o.Cat_number,
o.VesKg,
[Ind_price]=(CASE
when o.Ind_priceEU>0 then o.Ind_priceEU*@kurs
when o.Ind_priceUS>0 then o.Ind_priceUS
end),
[Dist_price]=(CASE
when o.Dist_priceEU>0 then o.Dist_priceEU*@kurs
when o.Dist_priceUS>0 then o.Dist_priceUS
end),
CAST('' as money) [PriceSPB],
o.Poshlina,
CAST('' as money) [Poslin],
CAST('' as money) [NDS],
CAST('' as money) [Pricenal],
CAST('' as money) [DostP],
CAST('' as money) [Doxod],
CAST('' as money) [Price],
s.value/100 [Skidka],
ROUND(d.value,4) [Dost],
CAST(t.value as real)/100 [TypeD],
CAST(p.value as real)/100 [Posh] INTO #Z
FROM Oborud o, Skidki s, Dost d,Types t, Poshlin p
WHERE o.Skidka=s.Name
and o.dost=d.Name
and o.Type=t.Name
and o.Poshlina=p.Name
and Cat_number=@num
Update #Z set @priceSPB=PriceSPB=Dist_price-(Dist_price*Skidka),
@Poslin=Poslin=(@PriceSPB*Posh),
@NDSS=NDS=(@PriceSPB+@Poslin)*@NDS,
@Pricenal=Pricenal=@PriceSPB+@Poslin+@NDSS,
@DostP=DostP=((VesKg*Dost)*(1+Posh))*(1+@NDS),
@Doxod=Doxod=(@DostP+@Pricenal)*TypeD,
@Price=Price=@DostP+@Pricenal+@Doxod
Select * from #Z order by Eng_name
Drop table #Z
20 фев 03, 13:58    [133039]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить