Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Есть четыре таблицы: пользователей (users), периодов (periods), начислений (charges) и платежей (payments).
- 1. Начисление и платеж производятся пользователем за отдельный период.
- 2. За один и тот же период может быть несколько начислений и платежей.
- 3. Но также за период их может и не быть.
- Задача. За один SELECT запрос получить сводную таблицу, строки которой содержат:
- 1. ID пользователя (user_id);
- 2. ID периода (period_id);
- 3. Cуммарное начисление за этот период для указанного пользователя (charge);
- 4. Cуммарнный платеж за тот же период (payment).
- 5. Размер задолженности на момент этого периода (debt). Если пользователь переплатил, то число может быть отрицательным. Внимание! Задолженность за предыдущие периоды должна суммироваться.
- Таблицы:
- users
- +-------+--------------+------+-----+---------+----------------+
- | Field | Type | Null | Key | Default | Extra |
- +-------+--------------+------+-----+---------+----------------+
- | id | int(11) | NO | PRI | NULL | auto_increment |
- +-------+--------------+------+-----+---------+----------------+
- periods
- +------------+---------+------+-----+---------+----------------+
- | Field | Type | Null | Key | Default | Extra |
- +------------+---------+------+-----+---------+----------------+
- | id | int(11) | NO | PRI | NULL | auto_increment |
- +------------+---------+------+-----+---------+----------------+
- charges
- +-----------+---------+------+-----+---------+----------------+
- | Field | Type | Null | Key | Default | Extra |
- +-----------+---------+------+-----+---------+----------------+
- | id | int(11) | NO | PRI | NULL | auto_increment |
- | value | double | YES | | NULL | |
- | period_id | int(11) | YES | | NULL | |
- | user_id | int(11) | YES | | NULL | |
- +-----------+---------+------+-----+---------+----------------+
- payments
- +-----------+---------+------+-----+---------+----------------+
- | Field | Type | Null | Key | Default | Extra |
- +-----------+---------+------+-----+---------+----------------+
- | id | int(11) | NO | PRI | NULL | auto_increment |
- | value | double | YES | | NULL | |
- | period_id | int(11) | YES | | NULL | |
- | user_id | int(11) | YES | | NULL | |
- +-----------+---------+------+-----+---------+----------------+
- SQL-запрос, создающий указанные таблицы в БД и наполняющих их демо-данными:
- ---------------------------------------------------------------------------
- SET NAMES utf8;
- SET time_zone = '+00:00';
- SET foreign_key_checks = 0;
- SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
- DROP TABLE IF EXISTS `charges`;
- CREATE TABLE `charges` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `value` double DEFAULT NULL,
- `period_id` int(11) DEFAULT NULL,
- `user_id` int(11) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- TRUNCATE `charges`;
- INSERT INTO `charges` (`id`, `value`, `period_id`, `user_id`) VALUES
- (1, 1000, 1, 1),
- (2, 1000, 2, 1),
- (3, 1000, 3, 1),
- (4, 1000, 4, 1),
- (5, 500, 5, 1),
- (6, 500, 5, 1);
- DROP TABLE IF EXISTS `payments`;
- CREATE TABLE `payments` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `value` double DEFAULT NULL,
- `period_id` int(11) DEFAULT NULL,
- `user_id` int(11) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- TRUNCATE `payments`;
- INSERT INTO `payments` (`id`, `value`, `period_id`, `user_id`) VALUES
- (1, 500, 1, 1),
- (2, 300, 2, 1),
- (3, 100, 4, 1);
- DROP TABLE IF EXISTS `periods`;
- CREATE TABLE `periods` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- TRUNCATE `periods`;
- INSERT INTO `periods` (`id`) VALUES
- (1),
- (2),
- (3),
- (4),
- (5);
- DROP TABLE IF EXISTS `users`;
- CREATE TABLE `users` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- TRUNCATE `users`;
- INSERT INTO `users` (`id`) VALUES
- (1),
- (2),
- (3);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement