Страница 1 из 1

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

Добавлено: 21 июн 2005, 12:28
ponyol
Доброго дня!

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

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

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

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


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

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

Добавлено: 21 июн 2005, 15:17
SAMZ
ponyol писал(а):Доброго дня!

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 22 июн 2005, 06:22
SAMZ
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: сводный запрос (таблица) ?

Добавлено: 22 июн 2005, 10:26
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. Определить по таким запросам потребное количество строк (т.е. товаров) и столбцов (количество кторых будет определяться количеством складов, в которых на момент запроса эти товары присутствуюх) - это не проблема
Хм, понятно. Но тогда проще сделать на клиенте выборку по складам и по этим результатам сформировать запрос:

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

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

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

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

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

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

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

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

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