2015-09-27 2 views
1

У меня есть следующий Postgresql запрос:заказа Результаты Postgresql Таблица хронологическим Дата

SELECT 
    to_char("Date", 'Mon') AS mon, 
    extract(year from "Date") AS yyyy, 
    SUM("Amount") FILTER (WHERE "Type" LIKE 'E0%') AS HTT, 
    SUM("Amount") FILTER (WHERE "Type" LIKE 'E1%') AS TTT 
FROM 
    "Transactions" 
WHERE 
    "Date" BETWEEN '01/01/2015' AND '08/31/2015' 
GROUP BY 1, 2 
ORDER BY 
    yyyy, 
    mon; 

Результаты я получаю в следующем порядке:

Mon | yyyy | HTT | TTT | 
Apr | 2014 | 50 | 75 | 
Aug | 2014 | 60 | 80 | 
Dec | 2014 | 55 | 40 | 
Jul | 2014 | 60 | 45 | 
Jun | 2014 | 50 | 55 | 

Однако, я хотел бы иметь возможность получить результаты в хронологическом порядке даты по месяцам и годам, чтобы результаты отображались следующим образом:

Mon | yyyy | HTT | TTT | 
Apr | 2014 | 50 | 75 | 
Jun | 2014 | 50 | 55 | 
Jul | 2014 | 60 | 45 | 
Aug | 2014 | 60 | 80 | 
Dec | 2014 | 55 | 40 | 

I Есть ли способ запросить таким образом, чтобы Mon и yyyy отображались в хронологическом порядке и в год?

ответ

1

У вас есть group by, поэтому самый простой способ сделать заказ на сегодняшний день в каждой группе:

order by min("Date") 
+0

Почему упорядочением по 'MIN()'? – fpietka

+0

@fpietka. , , Он выбирает одну дату из периода времени и использует ее для заказа. 'max (" Date ")' также может использоваться. Любая идея, почему downvote? –

+0

Итак, он избегает требования 'GROUP BY' в' Date', используя агрегированную функцию в дате. Не знал, что это будет действительным, пока я не увижу его [там] (http://stackoverflow.com/questions/5818216/is-it-possible-to-use-order-by-column-not-in-the- группа по). Следует сказать, что это важная часть ответа. – fpietka

0

Использование производной таблицы (подзапрос) с дополнительным столбцом для year-month:

select mon, yyyy, HTT, TTT 
from (
    select 
     to_char("Date", 'YYYYMM') as year_month, 
     to_char("Date", 'Mon') as mon, 
     extract(year from "Date") as yyyy, 
     sum("Amount") FILTER (WHERE "Type" LIKE 'E0%') as HTT, 
     sum("Amount") FILTER (WHERE "Type" LIKE 'E1%') as TTT 
    from "Transactions" 
    where "Date" between '01/01/2015' and '08/31/2015' 
    group by 1,2,3 
    ) sub 
order by year_month; 

или укоротить "Date" в месяц в подзапрос:

select 
    to_char("Date", 'Mon') as mon, 
    extract(year from "Date") as yyyy, 
    sum("Amount") FILTER (WHERE "Type" LIKE 'E0%') as HTT, 
    sum("Amount") FILTER (WHERE "Type" LIKE 'E1%') as TTT 
from (
    select date_trunc('month', "Date") "Date", "Amount", "Type" 
    from "Transactions" 
    where "Date" between '01/01/2015' and '08/31/2015' 
    ) sub 
group by "Date" 
order by "Date"; 
Смежные вопросы