Вывод счета из числа таблиц - PullRequest
2 голосов
/ 17 мая 2011

У меня есть следующие таблицы

customers

cust_id     cust_name
1           a company
2           a company 2
3           a company 3

tariffs

tariff_id   cost_1     cost_2     cost_3
1           2          0          3
2           1          1          1
3           4          0          0


terminals

term_id     cust_id      term_number     tariff_id
1           1            12345           1
2           1            67890           2
3           2            14324           1
4           3            78788           3

usage

term_ident  usage_type   usage_amount    date
12345       1            20              11/12/2010
67890       2            10              31/12/2010
14324       1            1               01/01/2011
14324       2            5               01/01/2011
78788       1            0               14/01/2011

В реальной жизни таблицы довольно велики - 5000 клиентов, 250 тарифов, 500000 терминалов и 5 миллионов записей об использовании.

Втаблица терминалов - term_id, cust_id и attribute_id - все внешние ключи.В таблице использования нет внешних ключей - это просто необработанные данные, импортированные из файла CSV.

В таблице использования могут быть терминалы, которых нет в таблице терминалов - их можно игнорировать.

То, что мне нужно сделать, - это выставить счет на каждого клиента при использовании.Я хочу включить использование только между 15.12.2010 и 15.01.2011 - это расчетный период.Мне нужно рассчитать отдельные позиции счета-фактуры для использования на основе его тарифа ... например: взять первую запись в таблице использования - стоимость использования_1 (для term_id 1) будет 90x2 = 180, это потому, чтоterm_ident использует номер_тарифа 1.

Вывод должен быть следующим:

Customer 2

date         terminal  usage_cost_1  usage_cost_2  usage_cost_3  total cost
01/01/2011   14324     18            0             6             24

Я компетентный разработчик PHP - но только начинающий с SQL.Мне нужно несколько советов по поводу наиболее эффективного процесса создания счетов-фактур - возможно, существует запрос SQL, который поможет мне до того, как обработка в PHP начнет вычислять затраты, - или, возможно, оператор SQL тоже может произвести затраты?Любой совет приветствуется ....

Редактировать:

1) В данный момент выполняется какой-то процесс - он написан на C ++ и занимает около 24 часов, чтобы его обработать ... я неу меня есть доступ к источнику.

2) Я использую Doctrine в Symfony - я не уверен, насколько полезен Doctrine для извлечения данных, поскольку объекты только замедляют процесс - и я не уверен, чтоздесь слишком сильно поможет использование объектов?

Edit @ 13: 54 ->

Неправильно ли указана таблица использования ... Извините!

Мне нужно сопоставитьиспользование_типа к стоимости на конкретном тарифе для каждого терминала, т.е. тип использования 1 = стоимость_1 в соответствующем тарифе ... Я думаю, что это немного усложняет?

1 Ответ

3 голосов
/ 17 мая 2011

Вот и все, должно занять не более 24 часов;)

SELECT u.date, u.term_ident terminal,
    (ta.cost_1 * u.usage_1) usage_cost_1,
    (ta.cost_2 * u.usage_2) usage_cost_2,
    (ta.cost_3 * u.usage_3) usage_cost_3,
    (usage_cost_1 + usage_cost_2 + usage_cost_3) total_cost
FROM usage u
INNER JOIN terminals te ON te.term_number = u.term_ident
INNER JOIN tariffs ta ON ta.tariff_id = te.tariff_id
INNER JOIN customers c ON c.cust_id = te.cust_id
WHERE u.date BETWEEN '2010-12-15' AND '2011-01-15'
    AND c.cust_id = 2

Этот запрос только для клиента с cust_id = 2. Если вы хотите получить результат для всего набора данных, просто удалите условие.

Обновление

Это не так тривиально с вашими новыми требованиями.Вы можете преобразовать таблицу использования в новую, которую вы разместили ранее.

Чтобы принять решение в запросах SELECT, вы можете сделать что-то вроде этого.Но это не тот результат, которого вы ожидаете.Его можно использовать для создания новой преобразованной таблицы использования.

SELECT u.date, u.term_ident terminal,
    CASE u.usage_type
        WHEN 1 then ta.cost_1 * u.usage_1
        WHEN 2 then ta.cost_2 * u.usage_2
        WHEN 3 THEN ta.cost_3 * u.usage_3
    AS usage_cost
FROM usage u
INNER JOIN terminals te ON te.term_number = u.term_ident
INNER JOIN tariffs ta ON ta.tariff_id = te.tariff_id
INNER JOIN customers c ON c.cust_id = te.cust_id
WHERE u.date BETWEEN '2010-12-15' AND '2011-01-15'
    AND c.cust_id = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...