2013-07-05 30 views
0

美好的一天。如何在SQL select中写入正确的ORDER BY ... DESC?

检查表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 

测试SQL可能被发现here

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

回答

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.

0

如果你愿意考虑改变你的数据库结构,我建议存储的签署值是正,如果状态是“了'并且如果状态是'关闭'则为负。

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

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的答案中的查询。