我有一个名为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时间戳值将日期存储在transaction_date
列中。现在我想显示月份号码。对于表中存在的所有transaction_dates,不同transaction_status的事务(即总事务发生在每个日期,状态'成功','进程','失败'和'已取消'的事务总数)。这些记录应按月分组。我尝试了很多以获得这个结果,但没有取得任何成功。供你参考我在下面提出我的问题:
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 GROUP BY FROM_UNIXTIME(transaction_date)
在这方面有谁能帮助我?提前谢谢。
答案 0 :(得分:1)
如果您只将transaction_date设置为日期,那将会容易得多。然后你可以使用内置函数。
例如,你可以做
SELECT year(transaction_date), month(transaction_date),
sum(whatever), ...
FROM user_transaction
GROUP BY YEAR(transaction_date), MONTH(transaction_date)
ORDER BY YEAR(transaction_date), MONTH(transaction_date);
如果您厌恶更改transaction_date的数据类型,那么您可以使用FROM_UNIXTIME即时转换它。我不建议这样做,因为它是每个查询中额外(不必要的)处理层。尽管如此,这意味着您可以按原样保留架构并写下:
SELECT year(FROM_UNIXTIME(transaction_date)), month(FROM_UNIXTIME(transaction_date)),
sum(whatever), ...
FROM user_transaction
GROUP BY YEAR(FROM_UNIXTIME(transaction_date)), MONTH(FROM_UNIXTIME(transaction_date))
ORDER BY YEAR(FROM_UNIXTIME(transaction_date)), MONTH(FROM_UNIXTIME(transaction_date));
讨厌,不是吗?你最好做一个'ALTER TABLE CHANGE COLUMN transaction_date transaction_date date',然后你就可以通过易于使用的MySQL函数获得日期数学的所有优势。