2011-08-21 180 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子查詢,另一個是外部查詢。