Как использовать агрегированные функции в mysql?

У меня есть 2 таблицы

  • студентов
  • Платежи

В таблице студентов у меня есть поля, например

student_id(Primary key),
student_name, 
student_university, 
student_counselor

В таблице платежей у меня есть поля типа

payment_id(Primary key),
student_id(Foreign key reference to students table), 
payable,
paid, 
balance

введите описание изображения здесь

Я пытаюсь достичь:

  • Покажите результат в форме ниже. Каждый консультант имеет своих студентов в разных университетах.
  • Общее количество студентов относится к конкретному университету от конкретного консультанта и сколько суммы выплачивается, выплачивается и балансирует, как показано в таблице выше.

Любое понимание?

Ответы

Ответ 1

Создать оператор для таблицы учеников:

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  `university` varchar(45) DEFAULT NULL,
  `counselor` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

Создать таблицу платежей оператора:

CREATE TABLE `payment` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `student_id` int(11) DEFAULT NULL,
  `payable` int(11) NOT NULL DEFAULT '0',
  `paid` int(11) NOT NULL DEFAULT '0',
  `balance` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `FK payment student_id student id_idx` (`student_id`),
  CONSTRAINT `FK payment student_id student id` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`) ON DELETE SET NULL ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

Вставка данных учащихся и платежей

INSERT INTO `student` (`name`, `university`, `counselor`) VALUES ('student 1', 'u 1', 'c 1');
INSERT INTO `student` (`name`, `university`, `counselor`) VALUES ('student 2', 'u 1', 'c 1');
INSERT INTO `student` (`name`, `university`, `counselor`) VALUES ('student 3', 'u 1', 'c 2');
INSERT INTO `student` (`name`, `university`, `counselor`) VALUES ('student 4', 'u 1', 'c 2');
INSERT INTO `student` (`name`, `university`, `counselor`) VALUES ('student 5', 'u 2', 'c 3');
INSERT INTO `student` (`name`, `university`, `counselor`) VALUES ('student 6', 'u 2', 'c 3');
INSERT INTO `student` (`name`, `university`, `counselor`) VALUES ('student 7', 'u 2', 'c 4');
INSERT INTO `student` (`name`, `university`, `counselor`) VALUES ('student 8', 'u 2', 'c 4');
INSERT INTO `payment` (`student_id`, `payable`, `paid`, `balance`) VALUES ('1', 500, 300, 200);
INSERT INTO `payment` (`student_id`, `payable`, `paid`, `balance`) VALUES ('2', 500, 300, 200);
INSERT INTO `payment` (`student_id`, `payable`, `paid`, `balance`) VALUES ('3', 400, 400, 400);
INSERT INTO `payment` (`student_id`, `payable`, `paid`, `balance`) VALUES ('4', 400, 400, 400);
INSERT INTO `payment` (`student_id`, `payable`, `paid`, `balance`) VALUES ('5', 100, 200, 300);
INSERT INTO `payment` (`student_id`, `payable`, `paid`, `balance`) VALUES ('6', 51, 52, 53);

И вот что мы имеем:

mysql> select * from student;
+----+-----------+------------+-----------+
| id | name      | university | counselor |
+----+-----------+------------+-----------+
|  1 | student 1 | u 1        | c 1       |
|  2 | student 2 | u 1        | c 1       |
|  3 | student 3 | u 1        | c 2       |
|  4 | student 4 | u 1        | c 2       |
|  5 | student 5 | u 2        | c 3       |
|  6 | student 6 | u 2        | c 3       |
|  7 | student 7 | u 2        | c 4       |
|  8 | student 8 | u 2        | c 4       |
+----+-----------+------------+-----------+
8 rows in set (0.02 sec)


mysql> select * from payment;
+----+------------+---------+------+---------+
| id | student_id | payable | paid | balance |
+----+------------+---------+------+---------+
|  1 |          1 |     500 |  300 |     200 |
|  2 |          2 |     500 |  300 |     200 |
|  3 |          3 |     400 |  400 |     400 |
|  4 |          4 |     400 |  400 |     400 |
|  5 |          5 |     100 |  200 |     300 |
|  6 |          6 |      51 |   52 |      53 |
+----+------------+---------+------+---------+
6 rows in set (0.00 sec)

запросить себя, чтобы выбрать всех консультантов:

SELECT 
    counselor,
    university,
    COUNT(name) AS 'no of students',
    SUM(payment.payable) AS payable,
    SUM(payment.paid) AS paid,
    SUM(payment.balance) AS balance
FROM
    student
        LEFT JOIN
    payment ON payment.student_id = student.id
GROUP BY counselor;

результат:

mysql>     SELECT
    ->         counselor,
    ->         university,
    ->         COUNT(name) AS 'no of students',
    ->         SUM(payment.payable) AS payable,
    ->         SUM(payment.paid) AS paid,
    ->         SUM(payment.balance) AS balance
    ->     FROM
    ->         student
    ->             LEFT JOIN
    ->         payment ON payment.student_id = student.id
    ->     GROUP BY counselor;
+-----------+------------+----------------+---------+------+---------+
| counselor | university | no of students | payable | paid | balance |
+-----------+------------+----------------+---------+------+---------+
| c 1       | u 1        |              2 |    1000 |  600 |     400 |
| c 2       | u 1        |              2 |     800 |  800 |     800 |
| c 3       | u 2        |              2 |     151 |  252 |     353 |
| c 4       | u 2        |              2 |    NULL | NULL |    NULL |
+-----------+------------+----------------+---------+------+---------+

Также вам не нужно использовать префикс student для всех полей в таблице student. Очевидно, что name в таблице student означает имя студента и т.д.

И вот просто PHP-код для печати таблицы.

Это класс db connect, поэтому вы можете пропустить его:

define('DB_MAIN', 'localhost|someroot|some|db');

class my_db{

    private static $databases;
    private $connection;

    public function __construct($connDetails){
        if(!is_object(self::$databases[$connDetails])){
            list($host, $user, $pass, $dbname) = explode('|', $connDetails);
            $dsn = "mysql:host=$host;dbname=$dbname";
            self::$databases[$connDetails] = new PDO($dsn, $user, $pass);
        }
        $this->connection = self::$databases[$connDetails];
    }

    public function fetchAll($sql){
        $args = func_get_args();
        array_shift($args);
        $statement = $this->connection->prepare($sql);
        $statement->execute($args);
         return $statement->fetchAll(PDO::FETCH_OBJ);
    }
}


$db = new my_db(DB_MAIN);

основной код php:

$universities = $db->fetchAll('SELECT distinct university FROM student');
$counselors = $db->fetchAll('SELECT distinct counselor FROM student');
$payments_ = $db->fetchAll(' SELECT
    counselor,
    university,
    COUNT(name) AS \'no of students\',
    SUM(payment.payable) AS payable,
    SUM(payment.paid) AS paid,
    SUM(payment.balance) AS balance
FROM
    student
        LEFT JOIN
    payment ON payment.student_id = student.id
GROUP BY counselor;');

$payments = [];

foreach ($payments_ as $payment)
    $payments[$payment->counselor][$payment->university] = $payment;
?>



<table border="1">
    <tr>
        <td rowspan="2" >counselor</td>
<?php
    foreach ( $universities as $key => $university){ ?>

        <td colspan="4" ><?=$university->university ?> </td>
    <?php } ?>
    </tr>
    <tr>
    <?php foreach ( $universities as $university){?>
        <td>no of students</td>
        <td>payable</td>
        <td>paid</td>
        <td>balance</td>
    <?php } ?>
    </tr>
    <tr>
    <?php foreach ( $counselors as $counselor){?>
    <?php foreach ( $universities as $key => $university){
        $payment = $payments[$counselor->counselor][$university->university];
    ?>
        <?php if(!$key){?>
        <td><?=$counselor->counselor?></td>
        <?php } ?>
        <td><?=(int)$payment->{'no of students'}?></td>
        <td><?=number_format($payment->payable,0,',','')?></td>
        <td><?=number_format($payment->paid,0,',','')?></td>
        <td><?=number_format($payment->balance,0,',','')?></td>
    <?php } ?>
    </tr>
    <?php } ?>
</table>

html result

<table border="1">
  <tr>
    <td rowspan="2">counselor</td>

    <td colspan="4">u 1 </td>

    <td colspan="4">u 2 </td>
  </tr>
  <tr>
    <td>no of students</td>
    <td>payable</td>
    <td>paid</td>
    <td>balance</td>
    <td>no of students</td>
    <td>payable</td>
    <td>paid</td>
    <td>balance</td>
  </tr>
  <tr>
    <td>c 1</td>
    <td>2</td>
    <td>1000</td>
    <td>600</td>
    <td>400</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
  </tr>
  <tr>
    <td>c 2</td>
    <td>2</td>
    <td>800</td>
    <td>800</td>
    <td>800</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
  </tr>
  <tr>
    <td>c 3</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>2</td>
    <td>151</td>
    <td>252</td>
    <td>353</td>
  </tr>
  <tr>
    <td>c 4</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
    <td>2</td>
    <td>0</td>
    <td>0</td>
    <td>0</td>
  </tr>
</table>

Ответ 2

AVG() - Returns the average value.
COUNT() - Returns the number of rows.
FIRST() - Returns the first value.
LAST() - Returns the last value.
MAX() - Returns the largest value.
MIN() - Returns the smallest value.
SUM() - Returns the sum.

Функция COUNT

Функция COUNT возвращает общее количество значений в указанном поле.

Предположим, что мы хотим получить количество раз, когда фильм с id 2 был арендован

SELECT COUNT (movie_id) FROM movierentals ГДЕ movie_id= 2;

Функция MIN

Функция MIN возвращает наименьшее значение в указанном поле таблицы.

Функция MAX

Как следует из названия, функция MAX противоположна функции MIN. Он возвращает наибольшее значение из указанного поля таблицы. SELECT MAX (year_released) FROM movies;

Функция СУММ

Функция MySQL СУММ, которая возвращает сумму всех значений в указанном столбце. SUM работает только с числовыми полями. Значения Null исключаются из возвращаемого результата.

SELECT SUM (amount_paid) FROM payments;

Функция AVG

Функция AVG MySQL возвращает среднее значение значений в указанном столбце. Подобно функции SUM, она работает только с числовыми типами данных.

SELECT AVG (amount_paid) FROM payments;