2011-08-15 40 views
0

我有2张桌子。第一个,称为“用户”看起来像这样:SQL:计算其他表中的百分比以及要过滤的用户百分比?

id | Username 
---------------------- 
1 | time 
2 | bill 
3 | jeff 

第二个,称为“信息”看起来像这样:

id | user | category 
---------------------- 
1 | bill | 3 
2 | tim | 1 
3 | bill | 3 
4 | bill | 2 

在类别列中的每个不同的数字对应于一个类别。


我试图创建一个SQL查询,将得到所有谁在一个特定的类别有自己的职位超过10%的用户。这里是我目前的(不工作的)代码对于类别3的样子:

SELECT 
    u.Username, 
    (
     (SELECT COUNT(*) FROM posts WHERE user=u.Username AND category=3) 
     /(SELECT COUNT(*) FROM posts WHERE user=u.Username) 
     * 100 
    ) AS percentage 
FROM users u 
WHERE percentage > 10 

这个查询理论上应该返回'账单'。但是,它不起作用!我在某处是否有语法错误,或者我的方法是错误的?

+0

是什么意思? – ysth

+0

从下面的帖子中,我相信这是因为我的'百分比'在哪里列。 –

+0

这仍然没有说明你有什么问题。它炸毁了吗?返回42?或'橙色'?它没有用,但它做了什么?现在不相关,但请在下次有问题时尝试说出。 – ysth

回答

1

百分比别名不能在where子句中存在。你必须使用having子句。

SELECT 
    u.Username, 
    (
     (SELECT COUNT(*) FROM posts WHERE user=u.Username AND category=3) 
     /(SELECT COUNT(*) FROM posts WHERE user=u.Username) 
     * 100 
    ) AS percentage 
FROM users u 
HAVING percentage > 10 
+1

感谢您接受的答案,但Scrum Meister的查询要好得多。我刚刚告诉过你的错误,没有像他那样花时间改进它。 :) –

2

而不是使用所有的子查询,可以查询直接posts表:“!这是行不通的”

SELECT Username, 
    (SUM(Category = 3)/COUNT(*)) * 100 AS percentage 
FROM posts 
GROUP BY 1 
HAVING percentage > 10