【问题标题】:How write right ORDER BY ... DESC in SQL select?如何在 SQL 选择中写入正确的 ORDER BY ... DESC?
【发布时间】:2013-07-05 15:43:26
【问题描述】:

美好的一天。

检查表here的结构。

我要选择:

select `idn` order by sum DESC,
where sum = (value amount where type = marks and status = up) - (value amount where type = marks and status = down)

为此,我使用 SQL:

select idn from Balans as outerB WHERE idn ! = '' group by idn order by 
ifnull((select sum(innerB.amount) from Balans as innerB 
    where innerB.idn = outerB.idn 
    and type='up'), 0) -
ifnull((select sum(innerB.amount) from Balans as innerB 
    where innerB.idn = outerB.idn 
    and type='down'), 0) DESC
limit 5

但在 SQL 中不正确ORDER by ... DESC

例如,在我的示例中,结果应该是:

187113012

6299927

可以在here找到测试SQL

请告诉我如何编写正确的 SQL 选择?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    使用CASE 怎么样?

      SELECT idn,
             (SUM(CASE WHEN type = 'marks' AND status = 'up' THEN amount ELSE 0 END)-
             SUM(CASE WHEN type = 'marks' AND status = 'down' THEN amount ELSE 0 END)) 
             AS result
        FROM Balans b
       WHERE idn != ''
    GROUP BY idn
    ORDER BY result DESC
       LIMIT 5;
    

    Live DEMO.

    【讨论】:

      【解决方案2】:

      如果您愿意考虑更改您的数据库结构,我建议将 amount 存储为一个有符号值,如果 status 为“up”,则该值为正如果 status 为“down”,则为负数。

      在这些条件下,您的查询会简单得多。

      SELECT idn, SUM(amount) as total
      FROM Balans as outerB 
      WHERE idn !='' AND type = 'marks'
      GROUP BY idn 
      ORDER BY total desc
      LIMIT 5
      

      但是,请注意,这不会返回表中没有任何“标记”的记录。如果您需要支持这一点,那么我认为您将重新使用 CASE 操作,类似于 Prix 答案中的查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-14
        • 2014-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-26
        • 1970-01-01
        相关资源
        最近更新 更多