我有桌上电话费,

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/

10-11 01:43