2012-08-09 47 views
2

我有一个表,像一个:显示所有分组结果和排序

| B | 1 | 
| C | 2 | 
| B | 2 | 
| A | 2 | 
| C | 3 | 
| A | 2 | 

我想取它,但排序和分组。也就是说,我希望按字母分组,但是按照组的最高金额排序。另外,我要显示的组内的所有条目:

| C | 3 | 
| C | 2 | 
| A | 2 | 
| A | 2 | 
| B | 2 | 
| B | 1 | 

顺序这样,因为C具有3和2。3 + 2 = 5,其对A,高于2 + 2 = 4对于B,转弯高于2 + 1 = 3。

我需要显示所有“分组”字母,因为还有其他所有我需要显示的列。

编辑:

感谢您的快速回复。然而,我有胆量进一步询问。

我有这个疑问:

SELECT * FROM `ip_log` WHERE `IP` IN 
(SELECT `IP` FROM `ip_log` GROUP BY `IP` HAVING COUNT(DISTINCT `uid`) > 1) 
GROUP BY `uid` ORDER BY `IP` 

在上面描述的字母ip(我需要它由IP地址分组)和数字timestamp(我需要它的总和排序(或只是用作排序参数))。我应该创建一个临时表,然后使用下面的解决方案吗?

+0

你能澄清你通过你的帖子的“被之和排序”是什么意思 - 澄清?什么东西? – Toote 2012-08-09 21:44:47

+0

按单个组的时间戳值的总和排序,就像字母按照与一组字母相对应的数字的总和排序一样。 – arik 2012-08-09 21:47:40

+0

如果列是时间戳我不确定SUM聚合函数的行为,所以我不太关注 – Toote 2012-08-09 22:10:00

回答

7
select t.Letter, t.Value 
from MyTable t 
inner join (
    select Letter, sum(Value) as ValueSum 
    from MyTable 
    group by Letter 
) ts on t.Letter = ts.Letter 
order by ts.ValueSum desc, t.Letter, t.Value desc 

SQL Fiddle Example

+0

+1 - Grr,比我快。 – 2012-08-09 21:40:27

+0

+1更快,SQL小提琴 – Toote 2012-08-09 21:43:25

0

如果表中的列是letternumber,我会到处去这样做,这将是以下方式:

SELECT 
    letter, 
    GROUP_CONCAT(number ORDER BY number DESC), 
    SUM(number) AS total 
FROM table 
GROUP BY letter 
ORDER BY total desc 

你会得到什么,根据您的示例如下:

| C | 3,2 | 5 
| A | 2,2 | 4 
| B | 2,1 | 3 

然后,您可以处理该数据以获取您想要/需要的实际信息。

如果您仍然希望原始请求格式的数据,那么使用单个查询是不可能的。原因是您无法根据在同一查询中未计算的汇总数据进行排序(number列的SUM)。所以,你需要做一个子查询来计算并反馈到原来的查询(免责声明:未经测试查询):

SELECT 
    letter, 
    number 
FROM table 
    JOIN (SELECT ltr, SUM(number) AS total FROM table GROUP BY letter) AS totals 
      ON table.letter = totals.ltr 
ORDER BY totals.total desc, letter desc, number desc