сводный запрос (таблица) ?

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
ponyol
Сообщения: 26
Зарегистрирован: 16 мар 2005, 17:08

сводный запрос (таблица) ?

Сообщение ponyol » 21 июн 2005, 12:28

Доброго дня!

Есть таблица:

склад товар количество

Как получить сводную таблицу

.................... склад .............. склад ..................... сумма
товар sum(количество) .... sum(количество) общее количество по складам


Можно ли это сделать запросом без создания промежуточной таблицы?

SAMZ
Сообщения: 128
Зарегистрирован: 21 мар 2005, 08:17

Re: сводный запрос (таблица) ?

Сообщение SAMZ » 21 июн 2005, 15:17

ponyol писал(а):Доброго дня!

Есть таблица:

склад товар количество

Как получить сводную таблицу

.................... склад .............. склад ..................... сумма
товар sum(количество) .... sum(количество) общее количество по складам


Можно ли это сделать запросом без создания промежуточной таблицы?
Можно ли вопрос понять так: в одной строке (записи) результирующего запроса представить информацию по количеству товара на каждом из складов и в той же строке представить общее количество на всех складах

ponyol
Сообщения: 26
Зарегистрирован: 16 мар 2005, 17:08

Re: сводный запрос (таблица) ?

Сообщение ponyol » 21 июн 2005, 15:18

SAMZ писал(а): Можно ли вопрос понять так: в одной строке (записи) результирующего запроса представить информацию по количеству товара на каждом из складов и в той же строке представить общее количество на всех складах
Да, именно так.

SAMZ
Сообщения: 128
Зарегистрирован: 21 мар 2005, 08:17

Re: сводный запрос (таблица) ?

Сообщение SAMZ » 21 июн 2005, 15:30

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

ponyol
Сообщения: 26
Зарегистрирован: 16 мар 2005, 17:08

Re: сводный запрос (таблица) ?

Сообщение ponyol » 21 июн 2005, 15:40

SAMZ писал(а): Если количесво складов фиксировано, можно сделать ХП с полями по складам (напрмер Sum1, Sum2 и т.д и полной суммой TotalSum). Но я бы так задачу ставить не стал.
В том то и дело, что не фиксировано :( .

SAMZ
Сообщения: 128
Зарегистрирован: 21 мар 2005, 08:17

Re: сводный запрос (таблица) ?

Сообщение SAMZ » 21 июн 2005, 15:56

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

ponyol
Сообщения: 26
Зарегистрирован: 16 мар 2005, 17:08

Re: сводный запрос (таблица) ?

Сообщение ponyol » 21 июн 2005, 16:06

SAMZ писал(а): Я бы такую задачу решал абсолютно традиционным путем, создавая иерархию запосов. На верхнем уровне товары, с суммой товара по всем складам. В подчиненном запросе склады с к-вом товара на складе и вся печаль
А нельзя ли примерчик, что-то я не врубился :( .

SAMZ
Сообщения: 128
Зарегистрирован: 21 мар 2005, 08:17

Re: сводный запрос (таблица) ?

Сообщение SAMZ » 22 июн 2005, 06:22

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. Определить по таким запросам потребное количество строк (т.е. товаров) и столбцов (количество кторых будет определяться количеством складов, в которых на момент запроса эти товары присутствуюх) - это не проблема

ponyol
Сообщения: 26
Зарегистрирован: 16 мар 2005, 17:08

Re: сводный запрос (таблица) ?

Сообщение ponyol » 22 июн 2005, 10:26

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

Так , ИМНО, будет красивее. Я просто думал, что можно это все сделать на сервере, но не получится :(.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 22 июн 2005, 11:22

Можно написать ХП, которая вернет например такой набор:
товар (варчар)
наличие_по_складам (варчар) /*сюда сливать все в одну строку, чтоб не париться с переменным числом параметров, напрмер отводить на каждое число одинаковое число символов, потом на клиенте либо парсить эту строку select substr(...)... , либо просто выставить в гриде моноширинный шрифт и выводить "as is"*/
итого (интегер)

ponyol
Сообщения: 26
Зарегистрирован: 16 мар 2005, 17:08

Сообщение ponyol » 22 июн 2005, 11:47

Ivan_Pisarevsky писал(а):Можно написать ХП, которая вернет например такой набор:
товар (варчар)
наличие_по_складам (варчар) /*сюда сливать все в одну строку, чтоб не париться с переменным числом параметров, напрмер отводить на каждое число одинаковое число символов, потом на клиенте либо парсить эту строку select substr(...)... , либо просто выставить в гриде моноширинный шрифт и выводить "as is"*/
итого (интегер)
Интересная мысль! Только как быть с названиями складов? Их тоже сливать в "наличие_по_складам (варчар)". Но тогда это будет не варчар, а блоб! Так получится?

SAMZ
Сообщения: 128
Зарегистрирован: 21 мар 2005, 08:17

Сообщение SAMZ » 22 июн 2005, 12:00

Ivan_Pisarevsky писал(а):Можно написать ХП, которая вернет например такой набор:
товар (варчар)
наличие_по_складам (варчар) /*сюда сливать все в одну строку, чтоб не париться с переменным числом параметров, напрмер отводить на каждое число одинаковое число символов, потом на клиенте либо парсить эту строку select substr(...)... , либо просто выставить в гриде моноширинный шрифт и выводить "as is"*/
итого (интегер)
Можно, конечно, и так, но как-то это Not good inaf. Можно и еще придумать варианты, тут кому, что нравится

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 22 июн 2005, 12:37

Интересная мысль! Только как быть с названиями складов? Их тоже сливать в "наличие_по_складам (варчар)". Но тогда это будет не варчар, а блоб! Так получится?
Их стОит извлечь предварительно, чтоб, если парсить строку на клиенте, знать что подписать в титл грида.

Вообще-то в дельфи есть компонента умеющая кубы строить, вкладочка "Decision Cube" :wink:

ponyol
Сообщения: 26
Зарегистрирован: 16 мар 2005, 17:08

Сообщение ponyol » 22 июн 2005, 12:45

Ivan_Pisarevsky писал(а):Вообще-то в дельфи есть компонента умеющая кубы строить, вкладочка "Decision Cube" :wink:
Что0то я про нее забыл, сейчас посмотрю.

ponyol
Сообщения: 26
Зарегистрирован: 16 мар 2005, 17:08

Сообщение ponyol » 22 июн 2005, 16:46

ponyol писал(а):
Ivan_Pisarevsky писал(а):Вообще-то в дельфи есть компонента умеющая кубы строить, вкладочка "Decision Cube" :wink:
Что0то я про нее забыл, сейчас посмотрю.
Decision Cube помогло без проблем, то что нужно. Тема закрыта, всем спасибо!

Ответить