Страница 1 из 2
					
				Нужна помощь в составлении запроса SQL
				Добавлено: 01 Март 2006, 11:24
				 ru_alex
				Всем привет!
MSSQL
 
Есть таблица остатков на складе:
поле: Дата
3 измерения (поля): Продукт, Склад, Поставщик (int)
поле: Кол-во  
поле: Единица измер. (int)
поле: Сумма 
поле: Валюта (int)
Итого 8 нужных полей.
Записи есть не на каждую дату, фиксируется изменение количества по 3 измерениями, то есть, если на "Склад1" 1 марта было 3 "ед" "Товар1" от "Поставщик1", а 3 марта по ним же стало 5 "ед", то имеем две записи на 1 марта 3 "ед", на 3 марта 5 "ед". Считается, что 2 марта было 3 "ед", хотя записи в таблице нет. (надеюсь понятно рассказал)
Как наиболее оптимально с точки зрения скорости и кол-ва кода (приоритет конечно же скорость) реализовать следующую задачу:
Получить таблицу в определенном интервале дат, который бьется на несколько мелких интервалов (день, неделя, месяц, квартал, год)
в ней след. инфа: 
1) по одному измерению значения количества и суммы в каждом мелком интервале на его конец. По остальным двум измерениям значения складываются ("товар1" на "склад1" - 2 "ед", "товар1" на "склад2" - 3 "ед", соответственно "товар1" - 5 "ед" )
2) среднее значение наличия на складе в каждом мелком интервале. Считается так: (Сумма количества (суммы) на каждый день) / (количество дней)
3) Единица хранения, если получается, что в разных, то это нужно отразить. То же с валютами.
4) Дата для отнесения записи к определенному мелкому интервалу.
Буду рад услышать любые советы и варианты. Задача привести текст запроса (запросов) не стоит, сам разберусь 

. Есть некий рабочий вариант, но он мне не нравится, кажется что можно лучше сделать.
 
			 
			
					
				Re: Нужна помощь в составлении запроса SQL
				Добавлено: 01 Март 2006, 15:13
				 Andrew™
				ru_alex писал(а):Всем привет!
MSSQL
 
Есть таблица остатков на складе:
поле: Дата
3 измерения (поля): Продукт, Склад, Поставщик (int)
поле: Кол-во  
поле: Единица измер. (int)
поле: Сумма 
поле: Валюта (int)
Итого 8 нужных полей.
Записи есть не на каждую дату, фиксируется изменение количества по 3 измерениями, то есть, если на "Склад1" 1 марта было 3 "ед" "Товар1" от "Поставщик1", а 3 марта по ним же стало 5 "ед", то имеем две записи на 1 марта 3 "ед", на 3 марта 5 "ед". Считается, что 2 марта было 3 "ед", хотя записи в таблице нет. (надеюсь понятно рассказал)
не до конца въехал, но насколько я понял проблема в том что есть дыры в датах и если бы их не было, то всё было бы пучком?
убрать дыры можно используя получение данных черех ХП, в которой читаем структуру table, ежели чего не хватает(Дыры) туда добавляем
т е читаем в цикле и запоминаем последее прочитанное, точнее посленее сохранённое в table, после след чтения проверяем, дата какая, если больше чем пред дата  + 1, то добавляем в цикле записи в table на диапазон разрыва с сохранёнными значениями
наполнили table структуру
и в конце
 select ... from myTable
на клиента попадёт результат
 
			 
			
					
				
				Добавлено: 01 Март 2006, 15:22
				 ru_alex
				
не до конца въехал, но насколько я понял проблема в том что есть дыры в датах и если бы их не было, то всё было бы пучком? 
Да, скорее всего, тут было бы легко такой запрос построить.
убрать дыры можно используя получение данных черех ХП, в которой читаем структуру table, ежели чего не хватает(Дыры) туда добавляем 
т е читаем в цикле и запоминаем последее прочитанное, точнее посленее сохранённое в table, после след чтения проверяем, дата какая, если больше чем пред дата + 1, то добавляем в цикле записи в table на диапазон разрыва с сохранёнными значениями 
1) А в какой файл удобнее заносить эти данные, в другой с такой же структурой? Исходный файл трогать нельзя. 
2) Насколько оценишь тормоза выполнения такой операции?
 
			 
			
					
				
				Добавлено: 01 Март 2006, 15:31
				 Andrew™
				ru_alex писал(а):
1) А в какой файл удобнее заносить эти данные, в другой с такой же структурой? Исходный файл трогать нельзя. 
не файл а есть тип данных в MSSQL в T-SQL - TABLE структура - её наполняй, а количество и качество полей только то, что требуется для поставленной задачи.
ru_alex писал(а):
2) Насколько оценишь тормоза выполнения такой операции?
тяжело сказать, сначало читаем данные, потом их отдаём, не вижу где должны быть какие то большие тормоза
 
			 
			
					
				
				Добавлено: 01 Март 2006, 15:34
				 ru_alex
				Спасибо, буду пробовать. О результатах напишу.
			 
			
					
				
				Добавлено: 02 Март 2006, 16:02
				 ru_alex
				Вообщем-то получается, но есть некоторые сложности при построении таблицы по выбранным позициям. Строить таблицу "без дыр" по всем а потом выбирать нужные несколько тормозно. 
Есть ли возможность передавать в процедуру таблицу? Это бы решило проблему.
А так остается только создавать процедуру каждый раз заново из клариона с ограниченим по некому созданному файлу номерков, что не очень удобно.
			 
			
					
				
				Добавлено: 02 Март 2006, 16:29
				 Дед Пахом
				Есть ли возможность передавать в процедуру таблицу? Это бы решило проблему.
В MSSQL функции могут возвращать таблицы
 
			 
			
					
				
				Добавлено: 02 Март 2006, 16:33
				 Andrew™
				Дед Пахом писал(а):Есть ли возможность передавать в процедуру таблицу? Это бы решило проблему.
В MSSQL функции могут возвращать таблицы
 
ДА, что отражено в T-HELP, не таблицы а TABLE структуры
 
			 
			
					
				
				Добавлено: 02 Март 2006, 18:34
				 ru_alex
				C этим я уже разобрался, процедура заполняет TABLE структуру. Она получается "без дыр" и возвращается на клиента, все ОК. 
Но выборка может быть не по всем продуктам и складам, а также и по некоему их набору, в зависимости от условия. 
Если бы можно было передать в процедуру этот самый набор, например в виде таблиц из одного int поля, то все вообще ОК. 
А так приходится процедуру дропить а потом создавать а в ней уже запросы inner join на файл из номерков (он перед этим создается и заполняется).
Жестко эти файлы сделать не получилось, т. к. пользователей в программе может быть много и теоретически все одновременно могут строить этот отчет. 
Может быть подход не очень, но удалось пока реализовать только так.
			 
			
					
				
				Добавлено: 03 Март 2006, 8:08
				 Andrew™
				ru_alex писал(а):C этим я уже разобрался, процедура заполняет TABLE структуру. Она получается "без дыр" и возвращается на клиента, все ОК. 
Но выборка может быть не по всем продуктам и складам, а также и по некоему их набору, в зависимости от условия. 
Если бы можно было передать в процедуру этот самый набор, например в виде таблиц из одного int поля, то все вообще ОК. 
А так приходится процедуру дропить а потом создавать а в ней уже запросы inner join на файл из номерков (он перед этим создается и заполняется).
Жестко эти файлы сделать не получилось, т. к. пользователей в программе может быть много и теоретически все одновременно могут строить этот отчет. 
Может быть подход не очень, но удалось пока реализовать только так.
а кто мешает до вызова ХП создать #ВРЕМЕННУЮ ТАБЛИЦУ
наполнить её кодами товаров
а в ХП
SELECT ... where КодТовара In (SELECT .. FROM #ВРЕМЕННАЯ ТАБЛИЦА)
 
			 
			
					
				
				Добавлено: 03 Март 2006, 10:45
				 ru_alex
				Примерно так и делается, но в это случае нужно ХП создавать каждый раз, т. к. имя #ВРЕМЕННАЯ ТАБЛИЦА постоянно разное. 
И вопрос такой, можно ли передавать в процедуру эту самую #ВРЕМЕННУЮ ТАБЛИЦУ, что бы не создавать каждый раз ХП, а хранить ее в базе.
			 
			
					
				
				Добавлено: 03 Март 2006, 11:29
				 Дед Пахом
				 нужно ХП создавать каждый раз, т. к. имя #ВРЕМЕННАЯ ТАБЛИЦА постоянно разное.
что за бред? 

 к таблице же не по физическому имени надо обращаться (типа temp.dbo.xxxxyyyy##1234567@#$), а по #ProdTable.
В одной хп создаёшь временную таблицу, в другой с ней работаешь. Вторая вызывается из первой.
Но я б сделал функцию, возвращающую table известной структуры,
а в хп 
Код: Выделить всё
SELECT ProdId,Price,Date FROM dbo.myfunc(@par1,@par2)
 
			 
			
					
				
				Добавлено: 03 Март 2006, 12:39
				 ru_alex
				Наверное я не знаю механизмов, о которых вы говорите как о самом разумеющемся.
Давай по пунктам:
1) Есть ХП в базе которая формирует Table выше описанным способом. Вопрос: как сразу ограничить выборку по выбранным позициям товаров для ускорения работы?
2) У меня есть очередь ID выбранных товаров. Что я умею (знаю): я могу этот набор занести в созданный темповый ФАЙЛ базы данных с неким именем и в ХП ограничить выборку по этому файлу (select по нему или Inner join не суть). 
3) Я правильно понял, что можно на этот файл указать что-то типа ссылки, которую будет "видно" в ХП? Если да то как?
			 
			
					
				
				Добавлено: 04 Март 2006, 19:01
				 Дед Пахом
				Я, если откровенно, не вникал в твою проблему конкретно, просто хотел сказать, что можно создать пользовательскую функцию (UDF) на сервере, которая возвращает набор данных в виде "таблицы" (а функции имеют параметры, так что можно выборку настраивать по своему желанию)
что-то вроде
FUNCTION myfunc(@LocProdId int, @LocActDate datetime)
RETURNS table(ProdId int, ActDate datetime)
......
  declare @rettable table(@ProdId int, @ActDate datetime)
  INSERT INTO rettable
  SELECT ProdId, ActDate
  FROM dbo.Products
  WHERE ProdId=@LocProdId AND ActDate <= @LocActDate
  RETURN rettable
а в вызывающей хп имеем
  SELECT * FROM myfunc(100,'2003-03-04')
Что-то вроде этого.
			 
			
					
				
				Добавлено: 06 Март 2006, 10:33
				 ru_alex
				2 Дед Пахом:
Это все понятно. Проблема в том, что продуктов в выборке может быть сотни, а не один. и все их передать в качестве параметка можно наверное только таблицей, вот я и спрашиваю, есть ли возможность передать таблицу в качестве параметра или каким-либо другим способом решить эту проблему?