【问题标题】:How to show the groupwise result for the following scenario?如何显示以下场景的分组结果?
【发布时间】:2013-07-12 11:17:55
【问题描述】:

我有一个名为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 列中。现在我从'dd/mm/yyyy'格式的表单中获取两个日期,将其转换为 UNIX Timestamp 并在以下查询中使用它。现在我想显示日期编号。在我给定的范围内的所有日期中,不同交易状态的交易(即每个日期发生的交易总数,状态为“成功”、“处理中”、“失败”和“已取消”的交易总数)。这些记录应按交易日期分组。我尝试了很多来获得这个结果,但没有取得任何成功。供您参考,我在查询下方给出:

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)

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

【问题讨论】:

    标签: php mysql sql unix-timestamp


    【解决方案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))
    

    我还从数字常量中删除了'。这些是数字,因此使它们看起来像字符串会产生误导(不会影响性能,只会影响查询的可理解性)。

    编辑:

    如果你想按月分组:

    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 子句以包含日期范围。

    【讨论】:

    • :再次感谢您。您的查询确实为我带来了魔力。你能帮我多一点吗?在上述查询中,结果按日期显示。现在我想按月显示相同的结果我应该如何实现它?意味着例如我想显示从 2012 年 1 月到 2013 年 6 月的月度结果
    • @phpLover 。 . .您可以在日期上使用函数year()month() 或函数date_format()。确保在group by 中与select 中的调用相同。
    • :感谢您的建议。我试过你的伎俩,但没有奏效。可能是我做错了什么。您能否向我提供查询作为此问题的答案。我会非常感谢你。
    猜你喜欢
    • 1970-01-01
    • 2016-12-15
    • 2013-05-28
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多