php - mysql函数划分列的总和值和

标签 php mysql sql

我有一张 table 电话付款,

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完成, 例如,如果“Silva”第一次支付 1300,他将支付 1 月的费用。 如果他再做 1300 笔付款,那么它将被标记为下个月,即“二月”。如果有人完成 15600 笔付款,它将被保存为“十二月”。 问题是,在计算 1 月的总金额时,必须考虑 12 月付款的 1300。

我想要的是计算每个月的总金额。问题是“Pay_Com”列是如上所述插入记录。它可以是全年或一个月。有什么办法可以解决这个问题。

我尝试了不同的方法,我可以使用全额总和除以 1300 来计算每个月的全额。任何人都可以建议我一个 soultion 或一个 sql 函数。 甚至用案例尝试了 IF 和 Sum..

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

最佳答案

你知道每个stuid每个月要交1300,你可以算出每个stuid交了多少钱。由此,您可以从第一个月开始分摊远期付款,并逐渐减少支付金额。

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/

相关文章:

c# - 用测试数据填充 SQL Server 表

php - 如果记录已经存在,如何跳过迭代? - PHP

php - 为什么此代码会导致解析错误?

javascript - node.js 中的未定义错误

php - SQLSTATE[23000] : Integrity constraint violation: 1052

mysql - 1054 - 'cliente' 中的未知列 'where clause'

php - 如何将行数可变的表单中的数据添加到 MySQL 表中?

mysql - 如何从数据库中删除重复条目?

php - 向所有订阅者(所有用户)发送电子邮件 PHP 和 MYSQL(每天 25,000 封邮件)

php - 如何通过 form_open_multipart 将 id 从 View 发送到 Controller CodeIgniter