2011-08-21 6 views
1

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

지금, 나는 각 행에 대해 나열 뷰, 총 가치

  • 송장 번호
  • 필요 인보이스의
  • 총 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의 뷰의 '더 하위 쿼리'규칙에, 그것은 허용되지 않습니다. 내가 가지고있는 방식으로 문제를 태클없이

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 하위 쿼리가 있고 다른 하나는 외부 쿼리가 있습니다.

관련 문제