2015-03-24 1 views
0

Это мой стол:Postgres - можно ли группировать подстроку одного из моих полей?

id    | integer     | not null default nextval('frontend_prescription_id_seq'::regclass) 
actual_cost  | double precision  | not null 
chemical_id  | character varying(9) | not null 
practice_id  | character varying(6) | not null 

Я хотел бы запросить результаты для конкретного practice_id, а затем просуммировать actual_cost по дате и по первых двух символов из chemical_id. Возможно ли это в Postgres?

Другими словами, я хотел бы вывод, чтобы выглядеть примерно так:

processing_date | cost | chemical_id_substr 
01-01-2010    1234  01 
01-02-2010    4366  01 
01-01-2010    3827  02 
01-02-2010    8768  02 

Это мой текущий запрос, но он группирует по всей chemical_id, не подстрока:

query = "SELECT SUM(actual_cost) as cost, processing_date, " 
    query += "chemical_id as id FROM frontend_items" 
    query += " WHERE practice_id=%s " 
    query += "GROUP BY processing_date, chemical_id" 
    cursor.execute(query, (practice_id,)) 

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

+0

'GROUP BY processing_date левый (chemical_id, 2)', но вы также необходимо использовать 'left (chemical_id, 2)' в списке выбора. Несвязанный, но: вы сравниваете для равенства в своем запросе: 'WHERE practice_id =% s', поэтому добавление'% '(' practice_id + '%' ') к параметру неверно, если вы не хотите удостовериться, что только значения, которые заканчиваются соответствие '%' –

+0

Это работает: 'GROUP by processing_data, substring (chemical_id from 1 for 2)'. Примечание: в списке выбора вы не можете «химический_ид». – juhist

+0

@a_horse_with_no_name спасибо, что работает красиво. Спасибо также за подсказку, я исправил опечатку. – Richard

ответ

2

Вы можете сделать это, но вы также должны убедиться, что подстрока используется в списке выбора, а не полная колонка:

SELECT SUM(actual_cost) as cost, 
     processing_date, 
     left(chemical_id,2) as id --<< use the same expression here as in the GROUP BY 
FROM frontend_items 
WHERE practice_id= %s 
GROUP BY processing_date, left(chemical_id,2); 
Смежные вопросы