Консультация № 27902
18.10.2005, 18:39
0.00 руб.
0 5 5
Доброго времени суток, уважаемые! нужно сделать запрос к базе, подскажите как реализовать, суть я думаю, ясна из приложения. 1-я таблица - та, которая есть в базе, 2-я - которую нужно получить в результате запроса
спасибо

Приложение:
аг-во | формат | количество________________________ааа | A4 | 3bbb | B5 | 8aaa | A5 | 12а результат запроса такой аг-во | A4 | A5 | B5________________aaa | 3 | 12 | 0bbb | 0 | 0 | 8

Обсуждение

Неизвестный
19.10.2005, 01:19
общий
это ответ
Здравствуйте, Степанюк Александр!
Такой результат можно получить, написав хранимую процедуру /если БД их поддерживает/.
Здесь есть большое НО:
врядли получится создать процедуру нормализованной /т.е. прийдется заранее определять параметры(поля) таблицы, которую будет возвращать процедура - в вашем случае это поля аг-во | A4 | A5 | B5; в теле процедуры прийдется пробежаться по исходной таблице и заполнить все данные с группировкой по полю аг-во/.
Другого варианта пока не придумал.
Удачи.
Неизвестный
19.10.2005, 08:23
общий
это ответ
Здравствуйте, Степанюк Александр!
можно сделать так.
написать функцию
function countp(agvop varchar, formatp varchar)
return number
is
res number;
begin
select sum(kolvo)
into res
from table1
where agvo=agvop and format=formatp;
return res;
end;

select agvo, countp(agvo,‘A4‘) ca4, countp(agvo,‘A5‘) ca5, countp(agvo,‘B5‘) cb5
from table1
group by agvo
Неизвестный
19.10.2005, 11:47
общий
это ответ
Здравствуйте, Степанюк Александр!

select ag, sum (A4) A4, sum (A5) A5, sum (B5) B5
from (
select ag, format A4, 0 A5, 0 B5
from tab1
where format = ‘A4‘
union all
select ag, 0 A4, format A5, 0 B5
from tab1
where format = ‘A5‘
union all
select ag, 0 A4, 0 A5, format B5
from tab1
where format = ‘B5‘
)
group by ag

Примерно так.
Неизвестный
20.10.2005, 11:15
общий
это ответ
Здравствуйте, Степанюк Александр!
Эта штука, насколько я понимаю, называется сводная таблица.
Я совсем недавно пытался найти здесь информацию по этому поводу, но увы..

Вариантов два - перекачиваете таблицу в EXCEL (или ACCESS ) и делаете сводную таблицу средствами этих приложений.
Помните ограничение EXCEL - не более 64000 строк !
ACCESS конечно может взять больше..

Вариант два - формируете на основании этой таблички куб ОЛАП и дальше работаете с ним
Это достаточно трудоемкий (на первом этапе)путь, но он позволяет обрабатывать любые объемы данных и получать справки в виде сводных таблиц EXCEL

Неизвестный
20.10.2005, 11:54
общий
это ответ
Здравствуйте, Степанюк Александр!

Поскольку предыдущие советы (с хранимыми процедурами и вложенными запросами) все равно сводились к перечислению значений поля ‘формат‘ в теле запроса, то предлагаю еще один вариант получения желаемого результата. Я не знаю особенностей FireBird, этот вариант будет работать под MySQL и требует поддержки LEFT JOIN. Имена полей взяты из вопроса.

Приложение:
SELECT tab1.аг-во, SUM(a4.количество) AS a4, SUM(a5.количество) AS a5, SUM(b5.количество) AS b5FROM tab1LEFT JOIN tab1 AS a4 ON tab1.аг-во=a4.аг-во AND a4.формат=‘a4‘LEFT JOIN tab1 AS a5 ON tab1.аг-во=a5.аг-во AND a5.формат=‘a5‘LEFT JOIN tab1 AS b5 ON tab1.аг-во=b5.аг-во AND b5.формат=‘b5‘GROUP BY tab1.аг-во;
Форма ответа