2015-11-05 4 views
0

У меня есть ниже 3 ТаблицыОбъединение столбцов из 2 разных таблиц, чтобы применить агрегатную функцию

Create table products(
    prod_id character(20) NOT NULL, 
    name character varying(100) NOT NULL, 
    CONSTRAINT prod_pkey PRIMARY KEY (prod_id) 
) 
Create table dress_Sales(
    prod_id character(20) NOT NULL, 
    dress_amount numeric(7,2) NOT NULL, 
    CONSTRAINT prod_pkey PRIMARY KEY (prod_id), 
    CONSTRAINT prod_id_fkey FOREIGN KEY (prod_id) 
    REFERENCES products (prod_id) MATCH SIMPLE 
    ON UPDATE NO ACTION ON DELETE NO ACTION 
) 
Create table sports_Sales(
    prod_id character(20) NOT NULL, 
    sports_amount numeric(7,2) NOT NULL, 
    CONSTRAINT prod_pkey PRIMARY KEY (prod_id), 
    CONSTRAINT prod_id_fkey FOREIGN KEY (prod_id) 
    REFERENCES products (prod_id) MATCH SIMPLE 
    ON UPDATE NO ACTION ON DELETE NO ACTION 
) 

Я хочу, чтобы получить Sum и Average продаж форму суммы как таблицы (только для выбранных Prod_id). Я пробовал код ниже, но он не дает никакой ценности.

select sum(coalesce(b.dress_amount, c.sports_amount)) as total_Amount 
from products a JOIN dress_sales b on a.prod_id = b.prod_id 
JOIN sports_sales c on a.prod_id = c.prod_id and a.prod_id = ANY({"123456","456789"}')` 

1000038923 Здесь в таблице dress_sales и 8002265822 в sports_sales.

ответ

1

Похоже, что ваш продукт может существовать только в одном столе (dress_sales или sports_sales).

В этом случае вы должны использовать left join:

select 
     sum(coalesce(b.dress_amount, c.sports_amount)) as total_amount, 
     avg(coalesce(b.dress_amount, c.sports_amount)) as avg_amount 
    from products a 
    left join dress_sales b using(prod_id) 
    left join sports_sales c using(prod_id) 
     where 
      a.prod_id in ('1', '2'); 

Если вы используете inner join (который по умолчанию) строка продукта не будет отображаться в наборе результатов, поскольку она не будет соединяться с любым dress_sales или sports_sales.

+0

Query отлично работает. :) –

1

Если у вас есть продукт, который появляется в обеих таблицах, вы можете использовать подзапрос, который может обрабатывать значения dress_amount и sports_amount.

select sum(combined.amount), avg(combined.amount) 
from 
    (select prod_id, dress_amount as amount from dress_sales 
    union all 
    select prod_id, sports_amount as amount from sports_sales) combined 
where 
    combined.prod_id in ('1','2'); 
Смежные вопросы