2011-08-21 182 views
1

我一直在关注如何在MySQL的约束条件下编写特定视图。将结果集中的SQL“合并”列合并到一个结果集中

下表和列是重要的:

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`) 
) 

现在,我需要一个观点,即每行列出,

  • 发票号码
  • 总价值的发票
  • 总t发票上
  • 和支付的对发票提出

但是总价值斧头,我无法弄清楚如何获得这三个单独的查询到同一个结果集每一个行发票,例如

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

我已经写了下面的查询来产生所需的结果,但是由于MySQL视图中的'no subquery'规则,这是不可接受的。

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

您可以创建两个视图。一个是UNION子查询,另一个是外部查询。