2013-05-23 3 views
0

Я пишу SQL-запрос в Mysql, где результат должен быть сгруппирован как с идентификатором, так и с датой. Дата определяется динамически и может быть либо простым полем datetime, либо комбинацией года и месяца или недели года. См. Запрос ниже для недели года;Использование DATE_FORMAT для группировки в mysql

SELECT t.transactionId, t.transactionDate, t.transactionProcessDate, 
t.status, t.type, t.versionId, t.note, WEEKOFYEAR(t.transactionDate) as CW, 
YEAR(t.transactionDate) as yr, (DATE_FORMAT(t.transactionDate, '%Y-%u')) as tDate 
FROM transaction t 
WHERE (t.status = 'A' or t.status = 'N') 
GROUP BY t.transactionId , tDate 

У меня есть проблема пытается группы по TDate,

GROUP BY t.transactionId , tDate 

который возвращает дубликаты с одинаковыми датами.

Когда я изменить запрос к группе по полям CW и уг,

GROUP BY t.transactionId , CW, yr 

я получаю ожидаемый результат, без дублей.

Вопрос: Есть ли проблема с группировкой полей, порожденное DATE_FORMAT, которые могут привести к возвращенного запроса не в состоянии recorgnize дубликаты?
Я хотел бы полностью исключить два поля CW и yr из запроса, поскольку они используются только для группировки.

+0

Вы пытались «GROUP BY t.transactionId, t.transactionDate' вместо этого? –

+0

Какую версию MySQL вы используете? –

+0

@ Þaw Это не сработает, потому что даты транзакций могут быть разными. – Awemo

ответ

1

ОБНОВЛЕНО Прежде всего, это трудно сказать, не видя ваши реальные данные, но GROUP BY DATE_FORMAT(t.transactionDate, '%Y-%u') работает просто отлично

SELECT transactionId, 
     DATE_FORMAT(transactionDate, '%Y-%u') tDate 
     ... 
    FROM transaction 
WHERE status IN('A', 'N') 
GROUP BY transactionId, tDate 

Вот SQLFiddle

На стороне записки: даже хотя MySql позволяет указать поле (в вашем случае t.status, t.type и т. д.) в SELECT, которое не является частью GROUP BY, это нехорошо. Вам необходимо применить функцию агрегирования к этому полю (MAX, MIN ...). Невозможно определить детерминистически, какое значение такого поля нужно захватить, когда вы делаете GROUP BY

+0

Это просто перемещает псевдонимы CW и yr в оператор GROUP BY. – Awemo

+0

@Awemo Можете ли вы разместить соответствующие данные выборок в виде таблиц? – peterm

+0

@Awemo См. Обновленный ответ. Если вы предоставите образцы данных, мы сможем выяснить вашу проблему. – peterm

Смежные вопросы