Нужна помощь в составлении запроса SQL

ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Нужна помощь в составлении запроса SQL

Сообщение 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) Дата для отнесения записи к определенному мелкому интервалу.

Буду рад услышать любые советы и варианты. Задача привести текст запроса (запросов) не стоит, сам разберусь :). Есть некий рабочий вариант, но он мне не нравится, кажется что можно лучше сделать.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Re: Нужна помощь в составлении запроса SQL

Сообщение 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

на клиента попадёт результат
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

не до конца въехал, но насколько я понял проблема в том что есть дыры в датах и если бы их не было, то всё было бы пучком?
Да, скорее всего, тут было бы легко такой запрос построить.
убрать дыры можно используя получение данных черех ХП, в которой читаем структуру table, ежели чего не хватает(Дыры) туда добавляем

т е читаем в цикле и запоминаем последее прочитанное, точнее посленее сохранённое в table, после след чтения проверяем, дата какая, если больше чем пред дата + 1, то добавляем в цикле записи в table на диапазон разрыва с сохранёнными значениями
1) А в какой файл удобнее заносить эти данные, в другой с такой же структурой? Исходный файл трогать нельзя.
2) Насколько оценишь тормоза выполнения такой операции?
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

ru_alex писал(а): 1) А в какой файл удобнее заносить эти данные, в другой с такой же структурой? Исходный файл трогать нельзя.
не файл а есть тип данных в MSSQL в T-SQL - TABLE структура - её наполняй, а количество и качество полей только то, что требуется для поставленной задачи.
ru_alex писал(а): 2) Насколько оценишь тормоза выполнения такой операции?
тяжело сказать, сначало читаем данные, потом их отдаём, не вижу где должны быть какие то большие тормоза
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

Спасибо, буду пробовать. О результатах напишу.
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

Вообщем-то получается, но есть некоторые сложности при построении таблицы по выбранным позициям. Строить таблицу "без дыр" по всем а потом выбирать нужные несколько тормозно.
Есть ли возможность передавать в процедуру таблицу? Это бы решило проблему.
А так остается только создавать процедуру каждый раз заново из клариона с ограниченим по некому созданному файлу номерков, что не очень удобно.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3136
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 11 раз
Поблагодарили: 31 раз
Контактная информация:

Сообщение Дед Пахом »

Есть ли возможность передавать в процедуру таблицу? Это бы решило проблему.
В MSSQL функции могут возвращать таблицы
С уважением, ДП
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

Дед Пахом писал(а):
Есть ли возможность передавать в процедуру таблицу? Это бы решило проблему.
В MSSQL функции могут возвращать таблицы
ДА, что отражено в T-HELP, не таблицы а TABLE структуры
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

C этим я уже разобрался, процедура заполняет TABLE структуру. Она получается "без дыр" и возвращается на клиента, все ОК.
Но выборка может быть не по всем продуктам и складам, а также и по некоему их набору, в зависимости от условия.
Если бы можно было передать в процедуру этот самый набор, например в виде таблиц из одного int поля, то все вообще ОК.
А так приходится процедуру дропить а потом создавать а в ней уже запросы inner join на файл из номерков (он перед этим создается и заполняется).
Жестко эти файлы сделать не получилось, т. к. пользователей в программе может быть много и теоретически все одновременно могут строить этот отчет.
Может быть подход не очень, но удалось пока реализовать только так.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

ru_alex писал(а):C этим я уже разобрался, процедура заполняет TABLE структуру. Она получается "без дыр" и возвращается на клиента, все ОК.
Но выборка может быть не по всем продуктам и складам, а также и по некоему их набору, в зависимости от условия.
Если бы можно было передать в процедуру этот самый набор, например в виде таблиц из одного int поля, то все вообще ОК.
А так приходится процедуру дропить а потом создавать а в ней уже запросы inner join на файл из номерков (он перед этим создается и заполняется).
Жестко эти файлы сделать не получилось, т. к. пользователей в программе может быть много и теоретически все одновременно могут строить этот отчет.
Может быть подход не очень, но удалось пока реализовать только так.
а кто мешает до вызова ХП создать #ВРЕМЕННУЮ ТАБЛИЦУ
наполнить её кодами товаров
а в ХП
SELECT ... where КодТовара In (SELECT .. FROM #ВРЕМЕННАЯ ТАБЛИЦА)
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

Примерно так и делается, но в это случае нужно ХП создавать каждый раз, т. к. имя #ВРЕМЕННАЯ ТАБЛИЦА постоянно разное.
И вопрос такой, можно ли передавать в процедуру эту самую #ВРЕМЕННУЮ ТАБЛИЦУ, что бы не создавать каждый раз ХП, а хранить ее в базе.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3136
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 11 раз
Поблагодарили: 31 раз
Контактная информация:

Сообщение Дед Пахом »

нужно ХП создавать каждый раз, т. к. имя #ВРЕМЕННАЯ ТАБЛИЦА постоянно разное.
что за бред? :shock: к таблице же не по физическому имени надо обращаться (типа temp.dbo.xxxxyyyy##1234567@#$), а по #ProdTable.

В одной хп создаёшь временную таблицу, в другой с ней работаешь. Вторая вызывается из первой.

Но я б сделал функцию, возвращающую table известной структуры,
а в хп

Код: Выделить всё

SELECT ProdId,Price,Date FROM dbo.myfunc(@par1,@par2)
С уважением, ДП
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

Наверное я не знаю механизмов, о которых вы говорите как о самом разумеющемся.
Давай по пунктам:
1) Есть ХП в базе которая формирует Table выше описанным способом. Вопрос: как сразу ограничить выборку по выбранным позициям товаров для ускорения работы?
2) У меня есть очередь ID выбранных товаров. Что я умею (знаю): я могу этот набор занести в созданный темповый ФАЙЛ базы данных с неким именем и в ХП ограничить выборку по этому файлу (select по нему или Inner join не суть).
3) Я правильно понял, что можно на этот файл указать что-то типа ссылки, которую будет "видно" в ХП? Если да то как?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3136
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 11 раз
Поблагодарили: 31 раз
Контактная информация:

Сообщение Дед Пахом »

Я, если откровенно, не вникал в твою проблему конкретно, просто хотел сказать, что можно создать пользовательскую функцию (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')

Что-то вроде этого.
С уважением, ДП
ru_alex
Ветеран
Сообщения: 333
Зарегистрирован: 21 Сентябрь 2005, 11:05
Откуда: Нижний Новгород
Контактная информация:

Сообщение ru_alex »

2 Дед Пахом:
Это все понятно. Проблема в том, что продуктов в выборке может быть сотни, а не один. и все их передать в качестве параметка можно наверное только таблицей, вот я и спрашиваю, есть ли возможность передать таблицу в качестве параметра или каким-либо другим способом решить эту проблему?
Ответить