Как смоделировать структуру ценообразования на основе операнда> (больше чем) или <(меньше чем) - PullRequest
0 голосов
/ 30 января 2012

У меня есть такая таблица контракта (посторонние данные удалены):

CREATE TABLE `contracts` (
  `id` INT(12),
  `serviceid` INT(10),
  `mode` CHAR(1),
  `months` TINYINT(3),
  `dateStart` INT(12),
  `dateEnd` INT(12),
  PRIMARY KEY (`id`)
)

Где данные могут быть примерно такими:

| id | serviceid | mode   | months  | dateStart  | dateEnd    |
| 1  | 111112    | active | 24      | 1319115600 | 1382274000 |
| 1  | 111113    | active | 6       | 1319115600 | 1382274000 |
| 1  | 111114    | active | 12      | 1319115600 | 1382274000 |

Я хотел бы добавить таблицу начислений, основанную на количестве времени, в течение которого пользователь заключил контракт, например:

CREATE TABLE `new_charge` (
  `id` INT(10),
  `operator` VARCHAR(1),
  `contract_length` TINYINT(2),
  `amount` DECIMAL(5,2),
  PRIMARY KEY (`id`)
)

Где данные могут быть примерно такими:

| id | operator | contract_length  | amount |
| 1  | <        | 6                | 100    |
| 2  | >        | 6                | 50     |

Значение, если срок контракта составляет <6 месяцев, взимать 100 долларов США. Если> 6 месяцев, взимается $ 50.

Хотя моделирование для меня выглядит нормально, я не могу написать запрос, который позволяет мне получить сумму сбора без необходимости писать дополнительный запрос.

Может ли кто-нибудь помочь мне с

  • Используя данные таблицы, сгенерируйте один запрос для получения суммы
  • Редизайн таблиц, который позволяет мне сгенерировать один запрос для получения суммы

Спасибо

1 Ответ

0 голосов
/ 30 января 2012

Если контракт может заключаться на сто лет, вам все равно нужно только 1200 строк для этой таблицы. Лично я бы использовал ограничения CHECK () для обоих столбцов, но MySQL не поддерживает ограничения CHECK ().

CREATE TABLE new_charge (
  contract_length_months integer not null,
  amount_usd DECIMAL(5,2),
  PRIMARY KEY (contract_length_months )
);

insert into new_charge values (1, 100);
insert into new_charge values (2, 100);
insert into new_charge values (3, 100);
insert into new_charge values (4, 100);
insert into new_charge values (5, 100);
insert into new_charge values (6, 100);
insert into new_charge values (7, 50);
insert into new_charge values (8, 50);
insert into new_charge values (9, 50);
insert into new_charge values (10, 50);
insert into new_charge values (11, 50);
insert into new_charge values (12, 50);
insert into new_charge values (13, 50);
insert into new_charge values (14, 50);
...

select c.*, nc.amount_usd
from contracts c
inner join new_charge nc on c.months = nc.contract_length_months
...