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

Откуда:
Сообщений: 99
Добрый день.
Столкнулся с проблемой при реализации запроса на MS Sql. Есть таблица с тремя колонками Amount, CurrencyRate, BtQuantity . Сначало необходимо сделать сортировку по возрастанию в колонке CurrencyRate. Есть некторое значение которое нужно сравнить со значениями в колнке BtQuantity. Если заданное значение меньше первого значение в колонке BtQuantity то необходимо из значение в колонке BtQuantity вычесть заданное значение и изменить значение в колонке BtQuantity на результат полученный от вычитания .

Например

колонка BtQuantity
30
мы сравниваем значение 30 с заданным значением например 25 в результате чего должно получиться

колонка BtQuantity
5

Это мой пример запроса где может быть ошибка ?
SELECT        Amount, CurrencyRate, BtQuantity, COUNT(BtQuantity) AS counter
FROM            OrderBuySell
WHERE        (BtQuantity > 25)
GROUP BY BtQuantity, Amount, CurrencyRate
ORDER BY CurrencyRate



Заранее благодарю.
16 июн 13, 21:12    [14439313]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с реализацией запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Так?
WITH CTE AS(SELECT TOP(1) * FROM OrderBuySell WHERE BtQuantity>25 ORDER BY CurrencyRate)
UPDATE CTE SET BtQuantity=BtQuantity-25;
16 июн 13, 21:42    [14439383]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с реализацией запроса  [new]
DEEENG
Member

Откуда:
Сообщений: 99
iap,

Спасибо. А если позиция строчки будит не первой строкой ?
16 июн 13, 21:50    [14439408]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с реализацией запроса  [new]
DEEENG
Member

Откуда:
Сообщений: 99
iap,
А если в первой будит 15 а во второй 30 сильно ли изменится алгоритм?
16 июн 13, 21:52    [14439415]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с реализацией запроса  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
DEEENG,

Вас не поймёшь.
Собственно говоря, и из первого сообщения непонятно, что на что апдейтить.
"Если заданное значение меньше первого значение в колонке BtQuantity то ..."
Собственно говоря, что такое "первого значение в колонке"?
Вообще первое? Или первое, большее 25?

Поэтому перет свим ответом я и спросил: "Так?"

Чётко напишите, что должно получиться.
16 июн 13, 22:00    [14439438]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с реализацией запроса  [new]
DEEENG
Member

Откуда:
Сообщений: 99
Вариант BtQuantity CurrencyRate Amount
1 123 100 2300
2 30 70 2100
3 273484254 105 2871584667
4 074444443 119 8858888717

Делаю запрос

WITH CTE AS(SELECT TOP(1) * FROM OrderBuySell WHERE BtQuantity>25 ORDER BY CurrencyRate)
UPDATE CTE SET BtQuantity=BtQuantity-25;


Получаю вот эту таблицу

Вариант BtQuantity CurrencyRate Amount
1 5 70 2100
2 123 100 12300




а если впервой строке будет 15 вместо 30, как перейти на второю строчку чтобы вычесть не достающие 10?
Заранее благодарен.
16 июн 13, 22:40    [14439551]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с реализацией запроса  [new]
qwerty112
Guest
DEEENG
ВариантBtQuantityCurrencyRateAmount
1 123100 2300
2 3070 2100
3 2,73484254105 287,1584667
4 0,74444443119 88,58888717

Делаю запрос

WITH CTE AS(SELECT TOP(1) * FROM OrderBuySell WHERE BtQuantity>25 ORDER BY CurrencyRate)
UPDATE CTE SET BtQuantity=BtQuantity-25;


Получаю вот эту таблицу

ВариантBtQuantityCurrencyRateAmount
1 5702100
2 12310012300




а если впервой строке будет 15 вместо 30, как перейти на второю строчку чтобы вычесть не достающие 10?
Заранее благодарен.

умеешь же ты мысли выражать ...
declare @xz int
set @xz = 25

declare @t table (Вариант int,	BtQuantity float,	CurrencyRate int,	Amount float)

insert into @t
select 0,	              15,	50,	              2100 union all
select 1,	              123,	100,	          2300 union all
select 2,	              30,	70,	              2100 union all
select 3,	       2.73484254,	105,	          287.1584667 union all
select 4,	      0.74444443,	119	,             88.58888717

select * from @t

;WITH cte1 AS
(
SELECT row_number() over(ORDER BY CurrencyRate, Вариант) as rn, * 
FROM @t 
),
cte2 as
(
select * , 
case when BtQuantity>@xz then @xz else BtQuantity end xz1,
case when BtQuantity>@xz then 0 else @xz-BtQuantity end xz2
from cte1 
where rn=1

union all

select cte1.* , 
case when cte1.BtQuantity>cte2.xz2 then cte2.xz2 else cte1.BtQuantity end,
case when cte1.BtQuantity>cte2.xz2 then 0 else cte2.xz2-cte1.BtQuantity end
from cte2 inner join cte1 on cte1.rn=cte2.rn+1
where case when cte1.BtQuantity>cte2.xz2 then cte2.xz2 else cte1.BtQuantity end > 0

)

UPDATE t 
SET t.BtQuantity=t.BtQuantity-cte2.xz1
from @t t inner join cte2 on t.Вариант=cte2.Вариант

select * from @t

(5 row(s) affected)
Вариант     BtQuantity             CurrencyRate Amount
----------- ---------------------- ------------ ----------------------
0           15                     50           2100
1           123                    100          2300
2           30                     70           2100
3           2,73484254             105          287,1584667
4           0,74444443             119          88,58888717

(5 row(s) affected)

(2 row(s) affected)

Вариант     BtQuantity             CurrencyRate Amount
----------- ---------------------- ------------ ----------------------
0           0                      50           2100
1           123                    100          2300
2           20                     70           2100
3           2,73484254             105          287,1584667
4           0,74444443             119          88,58888717

(5 row(s) affected)

но все эти "пряники" cte-шные тут нафиг не нужны,
делай через курсор - ничего не потеряешь
17 июн 13, 00:13    [14439735]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с реализацией запроса  [new]
DEEENG
Member

Откуда:
Сообщений: 99
qwerty112,

Огромнейшее спасибо. То что нужно. Не уверен что курсор будит быстро отрабатывать .
17 июн 13, 09:34    [14440186]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с реализацией запроса  [new]
DEEENG
Member

Откуда:
Сообщений: 99
qwerty112
Добрый день.
Не могу понять как мне модифицировать скрипт
чтобы вычитались не только BtQuantity но и Amount ?


select * , 
case when BtQuantity>@xz then @xz else BtQuantity end xz1,
case when BtQuantity>@xz then 0 else @xz-BtQuantity end xz2
from cte1 
where rn=1

union all

select cte1.* , 
case when cte1.BtQuantity>cte2.xz2 then cte2.xz2 else cte1.BtQuantity end,
case when cte1.BtQuantity>cte2.xz2 then 0 else cte2.xz2-cte1.BtQuantity end
from cte2 inner join cte1 on cte1.rn=cte2.rn+1
where case when cte1.BtQuantity>cte2.xz2 then cte2.xz2 else cte1.BtQuantity end > 0
25 июн 13, 16:04    [14481214]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить