сводный запрос (таблица) ?
сводный запрос (таблица) ?
Доброго дня!
Есть таблица:
склад товар количество
Как получить сводную таблицу
.................... склад .............. склад ..................... сумма
товар sum(количество) .... sum(количество) общее количество по складам
Можно ли это сделать запросом без создания промежуточной таблицы?
Есть таблица:
склад товар количество
Как получить сводную таблицу
.................... склад .............. склад ..................... сумма
товар sum(количество) .... sum(количество) общее количество по складам
Можно ли это сделать запросом без создания промежуточной таблицы?
Re: сводный запрос (таблица) ?
Можно ли вопрос понять так: в одной строке (записи) результирующего запроса представить информацию по количеству товара на каждом из складов и в той же строке представить общее количество на всех складахponyol писал(а):Доброго дня!
Есть таблица:
склад товар количество
Как получить сводную таблицу
.................... склад .............. склад ..................... сумма
товар sum(количество) .... sum(количество) общее количество по складам
Можно ли это сделать запросом без создания промежуточной таблицы?
Re: сводный запрос (таблица) ?
Да, именно так.SAMZ писал(а): Можно ли вопрос понять так: в одной строке (записи) результирующего запроса представить информацию по количеству товара на каждом из складов и в той же строке представить общее количество на всех складах
Re: сводный запрос (таблица) ?
Если количесво складов фиксировано, можно сделать ХП с полями по складам (напрмер Sum1, Sum2 и т.д и полной суммой TotalSum). Но я бы так задачу ставить не стал.ponyol писал(а):Да, именно так.SAMZ писал(а): Можно ли вопрос понять так: в одной строке (записи) результирующего запроса представить информацию по количеству товара на каждом из складов и в той же строке представить общее количество на всех складах
Re: сводный запрос (таблица) ?
В том то и дело, что не фиксированоSAMZ писал(а): Если количесво складов фиксировано, можно сделать ХП с полями по складам (напрмер Sum1, Sum2 и т.д и полной суммой TotalSum). Но я бы так задачу ставить не стал.

Re: сводный запрос (таблица) ?
Я бы такую задачу решал абсолютно традиционным путем, создавая иерархию запосов. На верхнем уровне товары, с суммой товара по всем складам. В подчиненном запросе склады с к-вом товара на складе и вся печальponyol писал(а):В том то и дело, что не фиксировано :( .SAMZ писал(а): Если количесво складов фиксировано, можно сделать ХП с полями по складам (напрмер Sum1, Sum2 и т.д и полной суммой TotalSum). Но я бы так задачу ставить не стал.
Re: сводный запрос (таблица) ?
А нельзя ли примерчик, что-то я не врубилсяSAMZ писал(а): Я бы такую задачу решал абсолютно традиционным путем, создавая иерархию запосов. На верхнем уровне товары, с суммой товара по всем складам. В подчиненном запросе склады с к-вом товара на складе и вся печаль

Re: сводный запрос (таблица) ?
Все достаточно просто.ponyol писал(а):А нельзя ли примерчик, что-то я не врубился :( .SAMZ писал(а): Я бы такую задачу решал абсолютно традиционным путем, создавая иерархию запосов. На верхнем уровне товары, с суммой товара по всем складам. В подчиненном запросе склады с к-вом товара на складе и вся печаль
Пусть в исходной таблице T у Вас три поля
SKLAD, TOVAR, KOLVO
Тогда первый запрос может выглядеть так
select TOVAR, sum(KOLVO) from T
group by TOVAR
Этот запрос дает Вам список товаров по всем складам и их суммарное кол-во. Если в исходной таблице могут быть записи с нулевым KOLVO, то в запрос можно включить предикат where KOLVO > 0
На следующем уровне у Вас должен быть запрос
select SKLAL, sum(KOLVO)
from T
where TOVAR = :TOVAR
group by SKLAD
Вы таким образом получаете информацию о наличии товара :TOVAR
агрегированную и сгруппированную по складам.
Надеюсь, Вам понятно, что при навигации по первому набору, необходимо для каждого товара переоткрывать второй набор.
Теперь последнее, как представить это в интерфейсе пользователя. Можно в виде двух GRID - ов. Ели Вам жестко поставили задачу представить каждый товар в одной строке с колонками: склад - количество..., то можно для визуализации использовать TStringGrid, динамически, в зависимости от результата заполняя его товарами, складами и количеством или, что предпочтительней, использовать табличку EXCEL. Определить по таким запросам потребное количество строк (т.е. товаров) и столбцов (количество кторых будет определяться количеством складов, в которых на момент запроса эти товары присутствуюх) - это не проблема
Re: сводный запрос (таблица) ?
Хм, понятно. Но тогда проще сделать на клиенте выборку по складам и по этим результатам сформировать запрос:SAMZ писал(а): Все достаточно просто.
Пусть в исходной таблице T у Вас три поля
SKLAD, TOVAR, KOLVO
Тогда первый запрос может выглядеть так
select TOVAR, sum(KOLVO) from T
group by TOVAR
Этот запрос дает Вам список товаров по всем складам и их суммарное кол-во. Если в исходной таблице могут быть записи с нулевым KOLVO, то в запрос можно включить предикат where KOLVO > 0
На следующем уровне у Вас должен быть запрос
select SKLAL, sum(KOLVO)
from T
where TOVAR = :TOVAR
group by SKLAD
Вы таким образом получаете информацию о наличии товара :TOVAR
агрегированную и сгруппированную по складам.
Надеюсь, Вам понятно, что при навигации по первому набору, необходимо для каждого товара переоткрывать второй набор.
Теперь последнее, как представить это в интерфейсе пользователя. Можно в виде двух GRID - ов. Ели Вам жестко поставили задачу представить каждый товар в одной строке с колонками: склад - количество..., то можно для визуализации использовать TStringGrid, динамически, в зависимости от результата заполняя его товарами, складами и количеством или, что предпочтительней, использовать табличку EXCEL. Определить по таким запросам потребное количество строк (т.е. товаров) и столбцов (количество кторых будет определяться количеством складов, в которых на момент запроса эти товары присутствуюх) - это не проблема
select s.TOVAR, (select sum(t.KOLVO) from t t where t.TOVAR=s.TOVAR and t.SKLAD=2), (select sum(t.KOLVO) from t t where t.TOVAR=s.TOVAR and t.SKLAD=3)......., (select sum(t.KOLVO) from t t where t.TOVAR=s.TOVAR and t.SKLAD=10), (select sum(t.KOLVO) from t t where t.TOVAR=s.TOVAR) from t s group by s.TOVAR
Так , ИМНО, будет красивее. Я просто думал, что можно это все сделать на сервере, но не получится

-
- Заслуженный разработчик
- Сообщения: 644
- Зарегистрирован: 15 фев 2005, 11:34
Можно написать ХП, которая вернет например такой набор:
товар (варчар)
наличие_по_складам (варчар) /*сюда сливать все в одну строку, чтоб не париться с переменным числом параметров, напрмер отводить на каждое число одинаковое число символов, потом на клиенте либо парсить эту строку select substr(...)... , либо просто выставить в гриде моноширинный шрифт и выводить "as is"*/
итого (интегер)
товар (варчар)
наличие_по_складам (варчар) /*сюда сливать все в одну строку, чтоб не париться с переменным числом параметров, напрмер отводить на каждое число одинаковое число символов, потом на клиенте либо парсить эту строку select substr(...)... , либо просто выставить в гриде моноширинный шрифт и выводить "as is"*/
итого (интегер)
Интересная мысль! Только как быть с названиями складов? Их тоже сливать в "наличие_по_складам (варчар)". Но тогда это будет не варчар, а блоб! Так получится?Ivan_Pisarevsky писал(а):Можно написать ХП, которая вернет например такой набор:
товар (варчар)
наличие_по_складам (варчар) /*сюда сливать все в одну строку, чтоб не париться с переменным числом параметров, напрмер отводить на каждое число одинаковое число символов, потом на клиенте либо парсить эту строку select substr(...)... , либо просто выставить в гриде моноширинный шрифт и выводить "as is"*/
итого (интегер)
Можно, конечно, и так, но как-то это Not good inaf. Можно и еще придумать варианты, тут кому, что нравитсяIvan_Pisarevsky писал(а):Можно написать ХП, которая вернет например такой набор:
товар (варчар)
наличие_по_складам (варчар) /*сюда сливать все в одну строку, чтоб не париться с переменным числом параметров, напрмер отводить на каждое число одинаковое число символов, потом на клиенте либо парсить эту строку select substr(...)... , либо просто выставить в гриде моноширинный шрифт и выводить "as is"*/
итого (интегер)
-
- Заслуженный разработчик
- Сообщения: 644
- Зарегистрирован: 15 фев 2005, 11:34
Их стОит извлечь предварительно, чтоб, если парсить строку на клиенте, знать что подписать в титл грида.Интересная мысль! Только как быть с названиями складов? Их тоже сливать в "наличие_по_складам (варчар)". Но тогда это будет не варчар, а блоб! Так получится?
Вообще-то в дельфи есть компонента умеющая кубы строить, вкладочка "Decision Cube"
