2015-08-08 3 views
2

У меня есть две таблицы, называемые «входящие» и «заказы», ​​и я хочу создать представление под названием «акции», которое создается с использованием данных входящих и заказов.способ рассчитать сумму двух столбцов в postgresql

CREATE TABLE incoming 
(
    id serial NOT NULL, 
    model integer, 
    size integer, 
    color integer, 
    price real, 
    quanity integer, 
    CONSTRAINT pk PRIMARY KEY (id), 
    CONSTRAINT "incoming_model_size_color_key" UNIQUE (model, size, color) 

)

CREATE TABLE orders 
(
    id serial NOT NULL, 
    model integer, 
    size integer, 
color integer, 
    price real, 
    quanity integer, 
    Comenttext text, 
    CONSTRAINT pk_orders PRIMARY KEY (id) 
) 

На данный момент у меня есть этот грязный раствор:

CREATE OR REPLACE VIEW stock AS 
WITH total_orders AS (
      SELECT orders.model, 
      orders.size, 
      orders.color, 
      sum(orders.quanity) AS sum 
      FROM orders 
      GROUP BY orders.color, orders.size, orders.model 
     ) 
SELECT incoming.model, 
    incoming.size, 
    incoming.color, 
    incoming.quanity - ((SELECT 
       CASE count(*) 
        WHEN 1 THEN (SELECT total_orders_1.sum 
         FROM total_orders total_orders_1 
         WHERE incoming.model = total_orders_1.model AND incoming.size = total_orders_1.size) 
        ELSE 0::bigint 
       END AS "case" 
      FROM total_orders 
      WHERE incoming.model = total_orders.model AND incoming.size=total_orders.size)) AS quanity 
    FROM incoming; 

, как я могу использовать его более ясным и простым?

примеры:

select * from incloming 

id | model | size | color | price | quanity 
----+-------+------+-------+-------+-------- 
    1 |  1 | 6 |  5 | 550 |  15 
    2 |  1 | 5 |  5 | 800 |  20 


select * from orders 

id | model | size | color | price | quanity | 
----+-------+------+-------+-------+---------+ 
    1 |  1 | 6 |  5 | 1000 |  1 | 
    2 |  1 | 6 |  5 | 1000 |  2 | -- sum is 3 

select * from stock 

model | size | color | quanity 
-------+------+-------+---------- 
1  | 6 |  5 |  12 --= 15 - 3 !! excellent 
1  | 5 |  5 |  20 -- has no oerders yet 
+0

Пожалуйста, отредактируйте ваш вопрос и добавьте образцы данных и ожидаемый результат на основе данных этого образца. Вероятно, вы ищете функцию 'lag()': http://www.postgresql.org/docs/current/static/functions-window.html –

ответ

0

Вам просто нужно налево присоединиться на агрегированных заказов:

select i.model, i.size, i.color, i.quantity, 
     o.qty as ordered, 
     i.quantity - coalesce(o.qty, 0) as quantity_on_stock 
from incoming i 
    left join (
    select model, size, color, sum(quantity) as qty 
    from orders 
    group by model, size, color 
) o on (o.model, o.size, o.color) = (i.model, i.size, i.color); 

SQLFiddle: http://sqlfiddle.com/#!15/7fbec/2

При использовании КТР в качестве базы, то ветер с это:

WITH total_orders AS (
    SELECT orders.model, 
     orders.size, 
     orders.color, 
     sum(orders.quantity) AS sum 
    FROM orders 
    GROUP BY color, size, model 
) 
SELECT i.model, 
     i.size, 
     i.color, 
     i.quantity - coalesce(tot.sum, 0) AS quanity 
FROM incoming i 
    LEFT JOIN total_orders tot on (tot.model, tot.size, tot.color) = (i.model, i.size, i.color); 

Независимо от того, нужно ли тестировать CTE или производную таблицу (первое решение) быстрее.

+0

Большое спасибо – qmor

Смежные вопросы