我正在获取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 18
和row_class 19
排除了row_class 20
,因为它只选择收费的用户。
其他说明:如果拥有2笔或以上注册费的用户总共需要支付400笔费用,而总费用仅为200笔,则该笔费用应仅计为1笔。
答案 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;
是的,按类和用户可以按两列进行分组。