PDA

Просмотр полной версии : Вапрос про SQL-запрос


kkk
22.06.2009, 13:49
Превед, крутые спецалисты. Есть задачка, с утра ломаю моцк, так ничо и не придумал.

Есть PostgreSQL, есть таблица, в ней три колонки: ФИО, сумма, дата. НУ, грубо говоря, описание счета, выставленного менеджером за что-то. На выходе надо поиметь годовой отчет: ФИО, Январь...Декабрь (в отдельных столбцах). В строках - соотвцно имена менеджеров и суммы выставленных счетов помесячно.

Вложенными запросами сервер делать не дает, запросы уровнем ниже первого больше одной строки возвращать не могут. Соответственно, у меня выходит только запрос, возвращающий обороты в целом, без разбивки по ФИО.

Я подзапросами делаю выборку сумм по месяцам, а вот как его допольнительно сгруппировать по ФИО - придумать не могу. Хелп.

Теоретически - я могу конечно в управляющую софтину эту задачу перегрузить, и собирать до кучи результаты нескольких запросов с выборкой по имени, но это неспортивно, хочется всю таблицу построить одним запросом.

Cayenne
22.06.2009, 13:58
А можна скл дамп таблички щоб потреніроватись ? а то впадло самому забивати дані для експеремента

kkk
22.06.2009, 14:10
А можна скл дамп таблички щоб потреніроватись ? а то впадло самому забивати дані для експеремента

нна. колонки - OrderCost, OrderCreationTime, ManagerName

kkk
22.06.2009, 14:13
Вот запрос, который пока есть, без разбивки по ФИО

SELECT
(SELECT sum("OrderCost") from ordertable WHERE (date_trunc('day', "OrderCreationTime") >= '01.01.2008') AND (date_trunc('day', "OrderCreationTime") <= '31.01.2008')) AS January,
(SELECT sum("OrderCost") from ordertable WHERE (date_trunc('day', "OrderCreationTime") >= '01.02.2008') AND (date_trunc('day', "OrderCreationTime") <= '28.02.2008')) AS February,
(SELECT sum("OrderCost") from ordertable WHERE (date_trunc('day', "OrderCreationTime") >= '01.03.2008') AND (date_trunc('day', "OrderCreationTime") <= '31.03.2008')) AS March,
(SELECT sum("OrderCost") from ordertable WHERE (date_trunc('day', "OrderCreationTime") >= '01.04.2008') AND (date_trunc('day', "OrderCreationTime") <= '30.04.2008')) AS April,
(SELECT sum("OrderCost") from ordertable WHERE (date_trunc('day', "OrderCreationTime") >= '01.05.2008') AND (date_trunc('day', "OrderCreationTime") <= '31.05.2008')) AS May,
(SELECT sum("OrderCost") from ordertable WHERE (date_trunc('day', "OrderCreationTime") >= '01.06.2008') AND (date_trunc('day', "OrderCreationTime") <= '30.06.2008')) AS June,
(SELECT sum("OrderCost") from ordertable WHERE (date_trunc('day', "OrderCreationTime") >= '01.07.2008') AND (date_trunc('day', "OrderCreationTime") <= '31.07.2008')) AS July,
(SELECT sum("OrderCost") from ordertable WHERE (date_trunc('day', "OrderCreationTime") >= '01.08.2008') AND (date_trunc('day', "OrderCreationTime") <= '31.08.2008')) AS August,
(SELECT sum("OrderCost") from ordertable WHERE (date_trunc('day', "OrderCreationTime") >= '01.09.2008') AND (date_trunc('day', "OrderCreationTime") <= '30.09.2008')) AS September,
(SELECT sum("OrderCost") from ordertable WHERE (date_trunc('day', "OrderCreationTime") >= '01.10.2008') AND (date_trunc('day', "OrderCreationTime") <= '31.10.2008')) AS October,
(SELECT sum("OrderCost") from ordertable WHERE (date_trunc('day', "OrderCreationTime") >= '01.11.2008') AND (date_trunc('day', "OrderCreationTime") <= '30.11.2008')) AS November,
(SELECT sum("OrderCost") from ordertable WHERE (date_trunc('day', "OrderCreationTime") >= '01.12.2008') AND (date_trunc('day', "OrderCreationTime") <= '31.12.2008')) AS December

Cayenne
22.06.2009, 14:45
Мммм думав табличку в мускл запарити.. а то нема постгре під рукою але вона ж блін велика :)

А якщо попробувати щось тіпа GROUP BY Month(date) ?

richi
22.06.2009, 15:17
select "ManagerName", sum(jan) as jan , sum(feb) as feb, sum(jun) as jun from
(
select
case when to_char("OrderCreationTime",'mm')='01' then sum("OrderCost") else 0 end as jan,
case when to_char("OrderCreationTime",'mm')='02' then sum("OrderCost") else 0 end as feb,
case when to_char("OrderCreationTime",'mm')='06' then sum("OrderCost") else 0 end as jun,
"ManagerName"
from ordertable
group by "ManagerName",to_char("OrderCreationTime",'mm')) as q
group by "ManagerName"

kkk
22.06.2009, 15:31
ешкин крот ! таки да, работает ! спасибо, добрый человек ! :)