Имя: Пароль:
1C
 
Получение остатков за период на каждый день SQL
0 AndrejK
 
23.09.09
11:48
Можно ли как-то одним SQL запросом без циклов и курсоров получить остатки на каждый день по списку товаров?? И если можно - то как?? Может кто чего делал подобное???
1 los_hooliganos
 
23.09.09
11:57
Можно.
2 Mikeware
 
23.09.09
11:58
(1) а у мню не получилось
3 orefkov
 
23.09.09
12:06
Группировка День ?
4 Sadovnikov
 
23.09.09
12:08
(2) Теоритически можно. Используя хитрые связывания. Только ОЧЕНЬ долго работать будет. Проще посчитать в запросе остатки на начало и в запросе же цикл устроить, прибавляя обороты по дням.
5 AndrejK
 
23.09.09
12:37
(4) Я так и сделал, работает довольно быстро. Хотеля выяснить, может кто как делал по-другому??
(3) Это для 1С запроса и довольно глючная группировка
6 Mikeware
 
23.09.09
12:41
(4) Так и сделал. Только цикл не в запросе.
7 Sadovnikov
 
23.09.09
12:43
(6) А почему не в запросе?
8 Mikeware
 
23.09.09
12:44
(7) Радиус кривизны рук маловат пока. :-)
9 Sadovnikov
 
23.09.09
13:00
Кстати, проводил интересный эксперимент. ТОчнее, не проводил, а он случайно получился :)
Задача: есть таблица на мсскл, с неким полем Ид. В нем возврастающая последовательность 1, 2, 3, 4, 5, 6, 7, 9, 10. отсутствует 8. таким образом два интервала. интервалов может быть скока угодно, надо вернуть мин макс для всех.
Имеем 2 решения:

1.

Create Table #Z(K Int)

Insert Into #Z Values(1)
Insert Into #Z Values(2)
Insert Into #Z Values(3)--
Insert Into #Z Values(5)
Insert Into #Z Values(6)
Insert Into #Z Values(9)--
Insert Into #Z Values(10)
Insert Into #Z Values(11)
Insert Into #Z Values(12)
Insert Into #Z Values(15)--
Insert Into #Z Values(18)--
Insert Into #Z Values(19)
Insert Into #Z Values(20)
Insert Into #Z Values(21)--

Create Table #X (Min Int, Max Int)

DECLARE @RowsCount Int, @ЧислоИзТаблицы Int, @МинЧисло Int, @ЧислоПоследовательности Int, @СтопудовоМинимальноеЧисло Int

DECLARE Числа CURSOR Local Forward_Only Read_Only STATIC FOR
Select K
From #Z
Order By K

OPEN Числа

Set @RowsCount = @@Cursor_Rows
Set @СтопудовоМинимальноеЧисло = -1
Set @МинЧисло = @СтопудовоМинимальноеЧисло

While @RowsCount > 0 Begin
    Fetch Числа Into @ЧислоИзТаблицы
    Set @RowsCount = @RowsCount - 1

    IF @МинЧисло = @СтопудовоМинимальноеЧисло Begin
         SET @МинЧисло = @ЧислоИзТаблицы
         SET @ЧислоПоследовательности = @ЧислоИзТаблицы
    End ELSE BEGIN
         IF @ЧислоИзТаблицы != @ЧислоПоследовательности + 1 BEGIN
              INSERT INTO #X (Min, Max) Values (@МинЧисло, @ЧислоПоследовательности)
              SET @МинЧисло = @ЧислоИзТаблицы
              SET @ЧислоПоследовательности = @ЧислоИзТаблицы
         END ELSE
              SET @ЧислоПоследовательности = @ЧислоИзТаблицы
    End
End

INSERT INTO #X (Min, Max) Values (@МинЧисло, @ЧислоПоследовательности)

CLOSE Числа
DEALLOCATE Числа

SELECT * FROM #X

Drop Table #Z
Drop Table #X

2.

create table t (n int)

insert into t
select 1 union all
select 3 union all
select 4 union all
select 5 union all
select 6 union all
select 7 union all
select 9

select min(n) nMin, max(n) nMax from
(select n,
n-(select count(distinct n) from t tt where tt.n<t.n) e
from t) z
group by e

drop table t

При заполнении исследуемой таблицы таким образом:
Create Table #Z(K Int)

Declare @Число1 Int, @Число2 Int

Set @Число1 = 0
Set @Число2 = 0

While @Число1 < 100000 BEGIN
    Set @Число1 = @Число1 + 1
   
    IF @Число2 < 5 BEGIN
         Set @Число2 = @Число2 + 1
         Insert Into #Z Values(@Число1)
    END ELSE
         Set @Число2 = 0
END

первый запрос выполнился за 12 секунд. Второго я ждал 7 минут и надоело - остановил.
P.S. Так что циклы - не всегда зло :)
10 Mikeware
 
23.09.09
13:01
(9) Кто-то в воскресенье решение постил. проверь его
11 Sadovnikov
 
23.09.09
13:04
(10) А покажи? Я не видел.
12 Mikeware
 
23.09.09
13:12
13 Sadovnikov
 
23.09.09
13:14
(12) Так там как раз второй вариант из (9).
14 toypaul
 
гуру
23.09.09
13:18
можно. читать на sql.ru про нарастающий итог
15 Sadovnikov
 
23.09.09
13:19
(14) И про проблемы с быстродействием :)