Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с запросом... / 13 сообщений из 13, страница 1 из 1
18.09.2002, 18:28:14
    #32051424
bax
bax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Есть вот такие таблицы (не связанные):
 Табл1.                      Табл. 2 
Товар1    100               Деньги1     110 
Товар2    150               Деньги2     30 
Товар3    50                Деньги3     200 

Надо с помощью запросов получить следующее:
Деньги1   Товар1    100 
Деньги1   Товар2    10 
Деньги2   Товар2    30 
Деньги3   Товар2    110 
Деньги3   Товар3    50 
Деньги3             40 
Как это замутить???Ума не приложу.Желательно без процедур...Но можно хоть как-нибудь.ПЛЗ! Моё мыло: 2bax@ukr.net
...
Рейтинг: 0 / 0
18.09.2002, 18:38:14
    #32051425
vadim_march
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом...
А теперь подробнее. Что означают числа? (например 40 и 10 в результирующей колонке) Какова логика соединения таблиц (не на бум лазаря же)
...
Рейтинг: 0 / 0
18.09.2002, 19:18:22
    #32051442
bax
bax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом...
Цифры означают стоимость товара и суммы денег. Смысл в том, что мы постепенно оплачиваем наличными деньгами весь товар. -> Сначала деньгами1 оплатили товар1, осталось 10у.е., потом этими 10 оплачиваем Товар2, деньги1 закончились. Берём деньги2, продолжаем оплачивать Товар2... и т.д.
...
Рейтинг: 0 / 0
18.09.2002, 19:40:27
    #32051449
Tulkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом...
select Товар,СуммаТовар,Деньги,СуммаДеньги, -1 As Остаток into #temp from Табл1,Табл2
order by Деньги,Товар

declare @a money
declare @b varchar(50)
update #temp set @a=case when @b=Деньги then @a-СуммаТовар else СуммаДеньги-СуммаТовар end ,@b=Деньги,Остаток =@a

select * from #temp where Остаток>0
...
Рейтинг: 0 / 0
18.09.2002, 19:41:53
    #32051450
Tulkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом...
Ошибочка не прочитал условие.Это начнет оплачивать заново.Сейчас склепаю так как надо.
...
Рейтинг: 0 / 0
18.09.2002, 20:03:49
    #32051455
bax
bax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом...
2 Tulkin

Будет клёво, если у тебя получится. А то я уже затр...я, ведь новичёк я в этом деле,а очень надо это сделать.
...
Рейтинг: 0 / 0
18.09.2002, 20:30:35
    #32051457
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом...
Мне кажется, что эта задача решается через курсоры.
По сути, надо по двум выборкам (Табл1. & Табл2.)
из целого воссоздать само целое, применив некое
правило (то, что каждый товар оплачивается на столько
хорошо, сколько позволяют финансы).

Удачи
...
Рейтинг: 0 / 0
18.09.2002, 20:40:46
    #32051460
vadim_march
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом...
Вставьте в QAnalyser и запустите
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
if object_id('tempdb..#gd')<>  0  begin drop table #gd end
create table #gd(gd_id int, prs float)
insert #gd values ( 1 ,  100 )
insert #gd values ( 2 ,  150 )
insert #gd values ( 3 ,  50 )
if object_id('tempdb..#m')<>  0  begin drop table #m end
create table #m(m_id int, _sum float)
insert #m values ( 1 ,  110 )
insert #m values ( 2 ,  30 )
insert #m values ( 3 ,  200 )
insert #m values ( 4 ,  500 )
if object_id('tempdb..#result')<>  0  begin drop table #result end
create table #result(m_id int, gd_id int, _sum float)
 --------------------------------------
 
declare @gd_id int, @prs float
declare @m_id int, @_sum float
declare @fetch_gd int, @fetch_m int

declare cur_gd cursor local dynamic
for select * from #gd order by gd_id
declare cur_m cursor local dynamic
for select * from #m order by m_id
open cur_gd
open cur_m
fetch next from cur_gd into @gd_id, @prs
set @fetch_gd = @@FETCH_STATUS
fetch next from cur_m into @m_id, @_sum
set @fetch_m = @@FETCH_STATUS
while (@fetch_gd + @fetch_m =  0 )begin
  declare @_money float
  set @_money = (case when @prs < @_sum then @prs
                      else @_sum end)
  insert #result values (@m_id, @gd_id, @_money)
  set @prs  = @prs  - @_money
  if @prs =  0  begin
    fetch next from cur_gd into @gd_id, @prs
    set @fetch_gd = @@FETCH_STATUS
  end
  set @_sum = @_sum - @_money
  if @_sum =  0  begin
    fetch next from cur_m into @m_id, @_sum
    set @fetch_m = @@FETCH_STATUS
  end
end
if @_sum >  0 
  insert #result values (@m_id, null, @_sum)
fetch next from cur_m into @m_id, @_sum
set @fetch_m = @@FETCH_STATUS
while (@fetch_m =  0 )begin
  insert #result values (@m_id, null, @_sum)
  fetch next from cur_m into @m_id, @_sum
  set @fetch_m = @@FETCH_STATUS
end
close cur_gd
close cur_m
deallocate cur_gd
deallocate cur_m
select * from #gd
select * from #m
select * from #result

Обратите внимание, что в таблице #m строк с деньгами - больше
Удачи :)
...
Рейтинг: 0 / 0
18.09.2002, 20:40:53
    #32051461
Tulkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом...
Была похожая задача, но с одной оплатой.Но там наворот в том, что под оплату подбирается количество.К сожалению, я не могу сейчас потратить время и подогнать ее под тебя, поэтому кидаю кусок кода с пояснением.Думаю должно хватить,чтобы понять идею и развить ее для своего случая.

#TempRes - Табличка с товарами.
Quantity-количество
Сost-цена
@PriceSum-Стоимость товара (в твоем случае это сумма цен товаров)

Для адаптации к нескольким оплатам надо
сделать примерно следующее:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
[/src]
    Begin
 --Открываем курсор по оплатам
 
select @pricesum=Полная стоимость товара
declare pays cursor for select paysum from #pays
open pays
while  1 = 1 
begin
fetch pays into @Paysum
if @@fetch_status<> 0  break
        //Выбрасываем то,что уже оплачено    
        select @Rest= 0 
        select @value = @PriceSum 
            Update #TempRes 
            set @Value=@Value-cost*Quantity,
                @Quantity=Quantity = case 
                                        when (@Value> 0 ) then Quantity  
                                        else 
                                            case 
                                                when  (@value+cost*Quantity> 0 )
                                                then  Quantity-floor(round((@Value+cost*Quantity)/cost, 2 , 0 ))
                                                else  Quantity  
                                            end
                                    end,
                need = case when (@Value> 0 ) and  @Quantity=Quantity
                            then  2  
                            else  0  
                    end,                              
        
                    @Rest= case when @value+cost*Quantity> 0 
                    then @value+cost*Quantity-(Quantity-@Quantity)*cost
                    else @Rest end
                    
            From #TempRes           
        End                            

     --Оплачиваем сколько можем
 
        select @value= @PaySum

        update  #TempRes 
        set     @Value = @Value-cost*Quantity,
                @Quantity = Quantity = 
                            
                            case when (@Value>= 0 ) 
                                then Quantity  
                                    else  floor(round((@Value+cost*Quantity)/cost, 2 , 0 ))
                            end,
                            
                need = 
                
                case when (@Quantity> 0 ) 
                    then  1  
                        else  0  
                end                           
                
        from    #TempRes     
        where   need<> 2 


 --результат этой оплаты 
 
select * from #TempRes where need= 1 

select @PriceSum=@PriceSum-@PaySum
update #TempRes set need= 0 
end
[src]

Еще раз акцентирую, что это не ГОТОВОЕ РЕШЕНИЕ для тебя, но ПОДСКАЗКА
...
Рейтинг: 0 / 0
18.09.2002, 20:42:39
    #32051462
vadim_march
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом...
2Tulkin
Привет второй столице от первой :-)
...
Рейтинг: 0 / 0
18.09.2002, 21:04:45
    #32051468
vadim_march
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом...
2BAX
Мое решение уже готовое и отлаженное (см выше) :-)
...
Рейтинг: 0 / 0
18.09.2002, 21:17:49
    #32051470
bax
bax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом...
2 Vadim_march

Можно нескромный вопрос? Где взять QAnaliser? :(
...
Рейтинг: 0 / 0
19.09.2002, 12:14:07
    #32051622
vadim_march
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом...
SQL Query Analyser (MS SQL ..., 7, 2000)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите с запросом... / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]