【问题标题】:How to show the monthwise result using SQL query for the following scenario?对于以下场景,如何使用 SQL 查询显示按月计算的结果?
【发布时间】:2013-07-12 12:12:15
【问题描述】:

我有一个名为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)

有人可以在这方面帮助我吗?提前致谢。

【问题讨论】:

  • @Eric Wich & @D Mac:我想显示月份。出色地。那我应该怎么写查询呢?
  • 我已经更新了我的答案以显示年份和月份(您需要年份,以便在年份变化时消除月份的歧义)。
  • @Eric Wich:通过使用您的查询,我得到的是按日期而不是按月的结果。
  • 您是否将 transaction_date 更改为日期而不是 bigint?您是否包含了“GROUP BY MONTH(transaction_date)”语句?
  • @DMc: 不,我没有将 transaction_date 数据类型从 bigint 更改为 date,而是使用了 GROUP BY MONTH(transaction_date)

标签: php mysql sql unix-timestamp


【解决方案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 函数进行日期数学运算的所有优势。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多