![]() |
|
Получение остатков за период на каждый день 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) И про проблемы с быстродействием :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |