【问题标题】:Mysql select query, splitting column data conditionally into 2 new columnsMysql select查询,有条件地将列数据拆分为2个新列
【发布时间】:2012-03-23 23:38:14
【问题描述】:

我有一个名为 credit_log 的表,列是

user_id | amount

金额可以是正数或负数。正数表示已购买积分,负数表示已花费积分。 所以,我想要一个返回

的查询
user_id | Bought | Spent 

本质上,我想将正金额值汇总为已购买,并将负金额汇总为已花费,我想按 user_id 进行分组

目前我有这样的查询

select user_id,sum(amount) from credit_log group by user_id;

但它总结了正值和负值。如何编写查询来分隔它们?

【问题讨论】:

    标签: mysql select group-by


    【解决方案1】:

    查询中的一些条件语句应该可以正常工作:

    SELECT
        user_id,
        SUM(IF(amount > 0, amount, 0)) bought,
        SUM(IF(amount < 0, amount, 0)) spent
    FROM credit_log
    GROUP BY user_id;
    

    【讨论】:

    • @JYelton 所以你在我写我的时候发帖了。没想到你发帖了。
    • 通常 SO 会尝试使用 JS 横幅来帮助您了解已发布的内容,但如果帖子相隔几秒钟,则通常警告不够。
    【解决方案2】:
     select user_id, sum(if(amount>0,amount,0)) bought, sum(if(amount<0,amount,0)) spent
     from web_user_credits group by user_id;
    

    【讨论】:

      【解决方案3】:

      我不是 100% 的语法在 mysql 中是一样的……但看起来是这样的:

      select
        user_id
       ,case when amount > 0 then amount else 0 end as bought
       ,case when amount < 0 then amount else 0 end as spent
      from
       credit_log
      

      您可以继续简单地将sum() 放在case 语句周围(包括end,但不包括as)。

      【讨论】:

        【解决方案4】:

        检查一下:

        select user_id , sum(if(amount< 0 ,0 ,amount )) as spent, 
            sum(if(amount> 0 ,0 ,amount )) as bought
        from  credit_log  group by  user_id
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-05
          • 1970-01-01
          • 2022-12-17
          • 2019-01-09
          • 2012-08-26
          • 1970-01-01
          • 2022-06-29
          相关资源
          最近更新 更多