每个用户ID仅获取一次所有行的总和

时间:2018-08-10 09:11:10

标签: mysql sql

我正在获取registration表中所有行的总和。表结构如下:

row_id  row_registration_fee  row_amount  row_class  row_user_id
1          200                 1000         18           1
2          200                 2510         18           1
3            0                 1600         19           2
4            0                 1500         19           1
5          200                 1254         19           3
6          200                 3000         19           1
7          200                 2000         19           1
8            0                  100         20           1
9            0                  300         20           2

一个用户可以有多个注册费。我需要将所有row_registration_fee乘以row_class。结果应该是这样的:

row_registration_fee  row_class
       200                18
       400                19
         0                20

我的选择:

SELECT (COUNT(DISTINCT(row_user_id))* 200) as 'fee' 
FROM registration 
WHERE row_registration_fee  > 0  
GROUP BY row_class

这里是否有更好的查询,可以给出与上述示例类似的结果?

结果将使用PHP中的foreach循环显示在表行中。到目前为止,它只会给我两个注册费用的结果,row_class 18row_class 19排除了row_class 20,因为它只选择收费的用户。

其他说明:如果拥有2笔或以上注册费的用户总共需要支付400笔费用,而总费用仅为200笔,则该笔费用应仅计为1笔。

4 个答案:

答案 0 :(得分:1)

另一种方法可能是找到最新的row_id。在这种情况下,我更改了数据,以使第一项输入似乎是错误(费用= 300),其后是第二项输入正确的金额。

drop table if exists t;
create table t(
row_id  int,row_registration_fee  int,row_amount int, row_class int, row_user_id int);
insert into t values
(1    ,      300  ,               1000 ,        18    ,       1),
(2    ,      200  ,               2510 ,        18    ,       1),
(3    ,        0  ,               1600 ,        19    ,       2),
(4    ,        0  ,               1500 ,        19    ,       1),
(5    ,      200  ,               1254 ,        19    ,       3),
(6    ,      200  ,               3000 ,        19    ,       1),
(7    ,      200  ,               2000 ,        19    ,       1),
(8    ,        0  ,                100 ,        20    ,       1),
(9    ,        0  ,                300 ,        20    ,       2)
;

select sum(row_registration_fee),row_class
from
(
select t.row_class,t.row_registration_fee
from t
where t.row_id = (select max(row_id) from t t1 where t1.row_user_id = t.row_user_id and t1.row_class = t.row_class)
) a
group by row_class;

+---------------------------+-----------+
| sum(row_registration_fee) | row_class |
+---------------------------+-----------+
|                       200 |        18 |
|                       400 |        19 |
|                         0 |        20 |
+---------------------------+-----------+
3 rows in set (0.00 sec)

答案 1 :(得分:0)

要获得那些预期的结果,那么在我看来,您首先需要获取每个(row_registration_fee,row_class,row_user_id)tupple的唯一记录。
您可以为此使用带DISTINCT的子查询。

然后将row_registration_fee相加。

SELECT 
 SUM(row_registration_fee) as fee, 
 row_class
FROM
(
   SELECT DISTINCT row_class, row_user_id, row_registration_fee
   FROM registration
) q
GROUP BY row_class

或通过GROUP BY获得最高费用。

SELECT 
 SUM(max_fee) as fee, 
 row_class
FROM
(
   SELECT 
    row_class, row_user_id,
    MAX(row_registration_fee) as max_fee
   FROM registration
   GROUP BY 
    row_class, row_user_id
) q
GROUP BY row_class

但是要解决当前查询,您可以删除该WHERE子句。
然后使用CASE WHEN在零row_registration_fee上返回NULL。
因为按值计数不计入NULL。

SELECT 
 COUNT(DISTINCT CASE WHEN row_registration_fee = 0 THEN row_user_id END) * 200 as fee,
 row_class
FROM registration
GROUP BY row_class

答案 2 :(得分:0)

您需要按两列分组,并使用sum

select row_class, sum(row_registration_fee)
from registration
group by row_class, row_user_id

答案 3 :(得分:0)

   SELECT SUM(row_registration_fee), row_class, row_user_id
    FROM registration 
    WHERE row_registration_fee  > 0
    GROUP BY row_class, row_user_id;

是的,按类和用户可以按两列进行分组。