我有桌上电话费,
paymentid stuid stu_name fullamount pay_comp
1 1234 Jhon 2600 Feb
2 1212 Silva 1300 Jan
3 1234 Jhon 1300 March
4 1212 Silva 3900 April
5 3333 Perera 15600 Dec
在这里,学生可以支付一整年,几个月或一个月的费用,1300元支付,
例如,如果“席尔瓦”第一次支付1300英镑,他将支付1月1日。
如果他再支付1300英镑,那么它将被标记为下个月的“二月”,如果有人完成15600英镑的支付,它将被保存为“十二月”。
问题是,在计算1月份的总金额时,必须考虑12月份的1300英镑。
我想要的是计算每个月的总金额。问题是“Pay_Com”栏是按上面的方式插入记录。它可以是全年的,也可以是一个月的。有没有办法解决这个问题。
我尝试了不同的方法,我能用全额之和除以1300来计算每个月的全额吗?有人能给我推荐一个soultion或一个sql函数吗。
甚至试过如果和案件一起。。
SELECT
CASE
WHEN round(sum(full_amount)/1300) = 1 THEN 1
ELSE 0
END AS 'Jan',
CASE
WHEN round(sum(full_amount)/1300) = 2 THEN 2
ELSE 0
END AS 'Feb',
CASE
WHEN round(sum(full_amount)/1300) = 3 THEN 3
ELSE 0
END AS 'March',
有人能给我提个解决办法吗。
提前谢谢。
我在找一件类似的东西。
Month Full_PaymentsRecived
Jan 20000
Feb 3900
.... ....
Dec 2600
最佳答案
你知道每个学生每月要交1300英镑,你可以计算出每个学生已经交了多少钱。你可以从第一个月开始,按你所付的金额递减,从中分摊。
SELECT Y.MM,
SUM(Y.DUEAMT) PAYMENTSEXPECTED,
SUM(Y.PAID) PAYMENTSRECEIVED,
(SUM(Y.PAID) / SUM(Y.DUEAMT)) * 100 RATIO_PAID_DUE,
SUM(CASE WHEN Y.PAID > 0 THEN 1 ELSE 0 END) NUMBER_OF_PAYMENTS_RECEIVED,
SUM(CASE WHEN Y.PAID = 0 THEN 1 ELSE 0 END) NUMBER_OF_PAYMENTS_MISSED,
SUM(CASE WHEN Y.PAID < Y.DUEAMT AND Y.PAID > 0 THEN 1 ELSE 0 END) NUMBER_OF_UNDERPAYMENTS
FROM
(
SELECT X.STUID,X.MM,
X.DUEAMT,
#IF(X.STUID <> @P, @TOTALPAID:=(SELECT SUM(FULLAMOUNT) FROM T WHERE T.STUID = X.STUID),0) TOTALPAID,
IF(X.STUID <> @P, @FULLAMOUNT:=(SELECT SUM(FULLAMOUNT) FROM T WHERE T.STUID = X.STUID)
#- X.DUEAMT
,
@FULLAMOUNT:=@FULLAMOUNT - X.DUEAMT) EXHAUST,
CASE WHEN @FULLAMOUNT >= X.DUEAMT THEN X.DUEAMT
WHEN @FULLAMOUNT < 0 THEN 0
ELSE @FULLAMOUNT
END AS PAID,
@P:=X.STUID
FROM
(
SELECT DISTINCT T.STUID , 1300 AS DUEAMT, S.MM
FROM T,
(
SELECT 1 AS MM UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION
SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION
SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12
) S
) X , (SELECT @TOTALPAID:=0,@FULLAMOUNT:=0,@P:=0) FA
ORDER BY X.STUID,X.MM
) Y
GROUP BY Y.MM
子查询S为每个学生生成每月的到期金额
然后,子查询X计算出每个学生每个月的支付金额
然后子查询Y聚合得到一个结果(我在您的问题中添加了一些不需要的加法分析)。
如此给定
MariaDB [sandbox]> select * from t;
+-----------+-------+----------+------------+----------+
| paymentid | stuid | stu_name | fullamount | pay_comp |
+-----------+-------+----------+------------+----------+
| 1 | 1234 | Jhon | 2600 | Feb |
| 2 | 1212 | Silva | 1000 | Jan |
| 3 | 1234 | Jhon | 1300 | Mar |
| 4 | 1212 | Silva | 3900 | Apr |
| 5 | 3333 | Perera | 15600 | Dec |
+-----------+-------+----------+------------+----------+
一组5行(0.02秒)
结果
MM | PAYMENTSEXPECTED | PAYMENTSRECEIVED | RATIO_PAID_DUE | NUMBER_OF_PAYMENTS_RECEIVED | NUMBER_OF_PAYMENTS_MISSED | NUMBER_OF_UNDERPAYMENTS |
+----+------------------+------------------+-------------------+-----------------------------+---------------------------+-------------------------+
| 1 | 3900 | 3900 | 100 | 3 | 0 | 0 |
| 2 | 3900 | 3900 | 100 | 3 | 0 | 0 |
| 3 | 3900 | 3900 | 100 | 3 | 0 | 0 |
| 4 | 3900 | 2300 | 58.97435897435898 | 2 | 1 | 1 |
| 5 | 3900 | 1300 | 33.33333333333333 | 1 | 2 | 0 |
| 6 | 3900 | 1300 | 33.33333333333333 | 1 | 2 | 0 |
| 7 | 3900 | 1300 | 33.33333333333333 | 1 | 2 | 0 |
| 8 | 3900 | 1300 | 33.33333333333333 | 1 | 2 | 0 |
| 9 | 3900 | 1300 | 33.33333333333333 | 1 | 2 | 0 |
| 10 | 3900 | 1300 | 33.33333333333333 | 1 | 2 | 0 |
| 11 | 3900 | 1300 | 33.33333333333333 | 1 | 2 | 0 |
| 12 | 3900 | 1300 | 33.33333333333333 | 1 | 2 | 0 |
+----+------------------+------------------+-------------------+-----------------------------+---------------------------+-------------------------+
12 rows in set (0.04 sec)
关于php - mysql函数将一列的和值相除,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43625706/