MySql查询:获取N行的总和,其中N在另一列值中定义

时间:2014-12-27 07:07:07

标签: mysql sql mysqli mysql-workbench

我有下表,

 id  |   add_card_id |   rate | category |  category_count |    counts | total
7597 |    723        |    3   |   7      |      1          |     300   | 108
7596 |    723        |    3   |   9      |      1          |     500   | 180
7594 |    723        |    3   |   11     |      1          |     400   | 240
7593 |    723        |    5   |   10     |      2          |     400   | 240
7593 |    723        |    5   |   13     |      2          |     400   | 240

我想获得total(列名)的总和,其中rate相同,但总和只包含第n个。具有最大总数的行,nth由category_count(列名称)定义。

例如,前三列的比率是3并且category_count是1,因此前三行的总和(总)是240,因为240> 180> 108,在最后两行的情况下,rate是5,category_count是2,所以240 + 240 = 480,我想要720 = 240(从前三行)+ 480(从最后两行)。

我尝试了以下查询

SELECT SUM(total) 
FROM (SELECT MAX(total) 
      FROM tableName 
      GROUP BY rate, category_count) as newTable

它给了我240+ 240,所以如何通过category_count(列)给出限制?

2 个答案:

答案 0 :(得分:0)

试试这个

select sum(cnt) from(select max(cnt)cnt from
(SELECT rate, category_count,total*count(*)cnt FROM tableName GROUP BY rate, category_count,total)temp group by rate, category_count)temp

Here My Example see the link

答案 1 :(得分:0)

您可以通过动态分配变量来模拟MySql中的ROW_NUMBER和PARTITION BY

SELECT rate, SUM(total) 
FROM 
(
  SELECT total, rate, category_count, 
         -- Row num counter, resets at each different rate
         @row_num := IF(@prev_rate=rate, @row_num+1, 1) AS RowNum, 
         @prev_rate := rate -- Track to see if we are in the same rate
  FROM tableName,
     (SELECT @row_num := 1) x, -- Set initial value for @row_num and @prev_rate
     (SELECT @prev_rate := '') y
  -- Important, must keep rates together, then order by your requirement
  ORDER BY rate ASC, total DESC 
) ranked
WHERE ranked.RowNum <= ranked.category_count -- Your requirement of TOP N
GROUP BY rate;

以上返回

Rate Total
3    240
5    480

如果您执行SELECT SUM(total)然后删除GROUP BY,您将获得720。

SqlFiddle here

修改

似乎费率被定义为(我假设你的样本数据中有一个整数)

`rate` varchar(X) COLLATE utf8_unicode_ci

更改一行:

 (SELECT @prev_rate := '' COLLATE utf8_unicode_ci) y

将临时跟踪变量设置为与列

相同的类型