SQL «слияние» столбцов из наборов результатов в один набор результатов - PullRequest
1 голос
/ 21 августа 2011

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

Важны следующие таблицы и столбцы:

CREATE TABLE `invoices` (
  `id` int(10) unsigned NOT NULL AUTO INCREMENT,
  PRIMARY KEY (`id`)
)

-- Joins payments to invoices. The sum of all `invoice_currency_value`s is the balance paid towards an invoice.
CREATE TABLE `financial_transactions_invoices` (
  `id` int(10) unsigned NOT NULL AUTO INCREMENT,
  `invoice` int(10) unsigned NOT NULL,
  `invoice_currency_value` decimal(8,2) unsigned NOT NULL,
  PRIMARY KEY (`id`)
)

-- Lists items (services) available to purchase.
CREATE TABLE `items` (
  `id` int(10) unsigned NOT NULL AUTO INCREMENT,
  `value` decimal(8,2) unsigned NOT NULL
  PRIMARY KEY (`id`)
)

-- Each instance represents that the `item` has been purchased.
CREATE TABLE `item_instances` (
  `id` int(10) unsigned NOT NULL AUTO INCREMENT,
  `invoice` int(10) unsigned NOT NULL,
  `item` int(10) unsigned NOT NULL,
  `invoice_currency_rate` decimal(11,5) unsigned NOT NULL,
  PRIMARY KEY (`id`)
)

-- Any number of tax instances can exist for an item instance and indicate this tax has been applied to the associated item instance.
CREATE TABLE `tax_instances` (
  `id` int(10) unsigned NOT NULL AUTO INCREMENT,
  `item_instance` int(10) unsigned NOT NULL,
  `value` decimal(8,2) unsigned NOT NULL,
  PRIMARY KEY (`id`)
)

Теперь мне нужно представление, которое перечисляет для каждой строки,

  • номер счета
  • общая стоимость счета
  • общая сумма налога на счете
  • и общая сумма платежей по счету

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

inv_no  total_value     total_tax       payments
1       150             5               120
2       120             10              20
3       10              0               10
4       1000            150             1150

Я написал следующий запрос, который дает желаемый результат, но из-за правила 'no subquery' в представлениях MySQL это неприемлемо.

SELECT `invoice_id`, SUM(`total_value`) AS `total_value`, SUM(`total_tax`) AS `total_tax`,
    SUM(`paid_balance`) AS `paid_balance`
FROM
(SELECT `invoices`.`id` AS `invoice_id`, SUM(`items`.`value` * `item_instances`.`invoice_currency_rate`) AS `total_value`,
    NULL AS `total_tax`, NULL AS `paid_balance`
FROM `items`
    JOIN `item_instances` ON `items`.`id` = `item_instances`.`item`
    JOIN `invoices` ON `item_instances`.`invoice` = `invoices`.`id`
GROUP BY `invoices`.`id`
UNION
SELECT `invoices`.`id`, NULL, SUM(`tax_instances`.`value`), NULL
FROM `tax_instances`
    JOIN `item_instances` ON `tax_instances`.`item_instance` = `item_instances`.`id`
    JOIN `invoices` ON `item_instances`.`invoice` = `invoices`.`id`
GROUP BY `invoices`.`id`
UNION
SELECT `invoices`.`id`, NULL, NULL, SUM(`financial_transactions_invoices`.`invoice_currency_value`)
FROM `financial_transactions_invoices`
    JOIN `invoices` ON `financial_transactions_invoices`.`invoice` = `invoices`.`id`
GROUP BY `invoices`.`id`) AS `components`
GROUP by `invoice_id`;

Не решая проблему так, как я, я не могу придумать другого способа сделать это в MySQL .

Есть идеи? Цени любую помощь.

1 Ответ

1 голос
/ 21 августа 2011

Вы можете создать два вида. Один с подзапросом UNION, другой с внешним запросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...