2013-07-12 4 views
0

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

transaction_id mediumint(6) UNSIGNED (PK) 
transaction_no varchar(55) 
transaction_cc_avenue_no varchar(55) 
transaction_card_category varchar(100) 
transaction_user_id  varchar(32) 
transaction_user_name varchar(255) 
transaction_user_email_id varchar(255) 
transaction_deal_code varchar(10) 
transaction_dc_id smallint(4) 
transaction_amount float(10,2) 
transaction_discount float(10,2) 
transaction_total_amount float(10,2) 
transaction_data_assign enum('0', '1') 
transaction_status enum('success', 'inprocess', 'fail', 'cancelled')  
transaction_date bigint(12) 
transaction_update_date bigint(12) 
transaction_update_user_id varchar(32) 

Я использую значение UNIX Timestamp для хранения даты в столбце transaction_date. Теперь я получаю две даты из формы в формате «dd/mm/yyyy», конвертирую ее в отметку времени UNIX и используя ее в следующем запросе. Теперь я хочу показать дату по часовой стрелке. (т. е. транзакции по каждой дате, общее количество транзакций статуса «успех», «inprocess», «fail» и «cancel») для всех дат между диапазоном, который я дал. Эти записи должны быть сгруппированы по дате транзакции. Я много пробовал получить этот результат, но не добился успеха. Для вашей справки я даю ниже моего запроса:

SELECT COUNT(*) `total count`, SUM(transaction_status = 'success') `success`, SUM(transaction_status = 'inprocess') `inprocess`, SUM(transaction_status = 'fail') `fail`, SUM(transaction_status = 'cancelled') `cancelled` FROM user_transaction WHERE transaction_date >= '1325376000' AND transaction_date <= '1338422400' GROUP BY FROM_UNIXTIME(transaction_date) 

Может ли кто-нибудь помочь мне в этом отношении? Заранее спасибо.

ответ

1

Функция from_unixtime() создает дату с указанием времени на нем. Вы просто хотите, дата:

SELECT date(FROM_UNIXTIME(transaction_date)), 
     COUNT(*) `total count`, SUM(transaction_status = 'success') `success`, 
     SUM(transaction_status = 'inprocess') `inprocess`, 
     SUM(transaction_status = 'fail') `fail`, 
     SUM(transaction_status = 'cancelled') `cancelled` 
FROM user_transaction 
WHERE transaction_date >= 1325376000 AND transaction_date <= 1338422400 
GROUP BY date(FROM_UNIXTIME(transaction_date)) 

я уронил ' от постоянных чисел. Это числа, поэтому вводить их в заблуждение, чтобы они выглядели как строки (не влияет на производительность, просто на понятность запроса).

EDIT:

Если вы хотите сгруппировать в месяц:

SELECT year(date(FROM_UNIXTIME(transaction_date))), 
     month(date(FROM_UNIXTIME(transaction_date))), 
     COUNT(*) `total count`, SUM(transaction_status = 'success') `success`, 
     SUM(transaction_status = 'inprocess') `inprocess`, 
     SUM(transaction_status = 'fail') `fail`, 
     SUM(transaction_status = 'cancelled') `cancelled` 
FROM user_transaction 
WHERE transaction_date >= 1325376000 AND transaction_date <= 1338422400 
GROUP BY year(date(FROM_UNIXTIME(transaction_date))), 
     month(date(FROM_UNIXTIME(transaction_date))) 

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

+0

: Большое вам спасибо еще раз. Ваш запрос действительно сделал магию для меня. Можете ли вы мне немного помочь? В приведенном выше запросе rsults отображаются по дате. Теперь я хочу показать те же результаты в месяц, как мне его достичь? Средства, например. Я хочу показать ежемесячные результаты с января по июнь 2013 года – PHPLover

+0

@phpLover. , , Вы можете использовать функции 'year()' и 'month()' в дате или в функции 'date_format()'. Убедитесь, что вы помещаете одни и те же вызовы в 'group by', как в' select'. –

+0

: Спасибо за ваше предложение. Я попробовал трюк, но это не сработало. Может быть, я делаю что-то неправильно. Можете ли вы предоставить мне запрос в качестве ответа на этот вопрос. Я был бы вам очень благодарен. – PHPLover

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