2015-12-29 2 views
0

У меня есть две таблицы следующим образом.Сравнение суммы 1 столбец таблицы с другим столбцом таблицы

продукт

+-----------------------------+ 
| id  min_stock is_order | 
+-----------------------------+ 
| p1  5   y  | 
| p2  6   y  | 
| p3  5   y  | 
| p4  0   n  | 
+-----------------------------+ 

Stock

+-----------------------------+ 
| id product_id quantity | 
+-----------------------------+ 
| 1  p1   3  | 
| 2  p1   5  | 
| 3  p2   2  | 
+-----------------------------+ 

Теперь я хочу, чтобы все записи, в которых is_order статус y и чьи sum(quantity)<= min_stock.

Извините, может быть, мое предложение не очистит вас. но в моем результате следует получить product_id.

p2
p3

Как я могу это сделать?

ответ

0

Вы можете использовать APPLY получить sum_quantity:

SQL Fiddle

SELECT p.product_id 
FROM product p 
OUTER APPLY(
    SELECT SUM(quantity) AS sum_quantity 
    FROM Stock 
    WHERE product_id = p.product_id 
)s 
WHERE 
    p.is_order= 'y' 
    AND (
     s.sum_quantity IS NULL 
     OR s.sum_quantity <= p.min_stock 
    ) 

В качестве альтернативы, вы можете использовать LEFT JOIN и SUM и HAVING:

SQL Fiddle

SELECT p.product_id 
FROM product p 
LEFT JOIN Stock s 
    ON s.product_id = p.product_id 
WHERE 
    p.is_order = 'y' 
GROUP BY p.product_id, p.min_stock 
HAVING SUM(ISNULL(s.quantity, 0)) <= p.min_stock 
0
select p.* 
from product p 
inner join (
    select 
     product_id, SUM(quantity)quantity 
    from stock 
    group by product_id 
) s on p.id = s.product_id 
where 
    s.quantity <= p.min_stock 
    and p.is_order = 'y' 
0
;with cte(product_id , quantity) 
AS 
(
    select product_id, sum(quantity) 
    from Stock 
    group by product_id 
) 

select * from 
Product p 
left join cte s on p.product_id = s.product_id 
where p.order_status = 'y' and min_stock <> 0 
and isnull(s.quantity,-1) < p.min_stock 

http://www.sqlfiddle.com/#!3/78470/14

+0

может у пожалуйста, пересмотреть вопрос я изменить в нем. – ros001

+0

@ user1759006 обновленный запрос, пожалуйста, посмотрите. В любом случае, одно из решений здесь уже работает для вас, я думаю. :) – Mukund

0
CREATE TABLE #product 
    (id varchar(2), min_stock int, is_order varchar(1)) 
; 

INSERT INTO #product 
    (id, min_stock, is_order) 
VALUES 
    ('p1', 5, 'y'), 
    ('p2', 6, 'y'), 
    ('p3', 5, 'y'), 
    ('p4', 0, 'n') 
; 


CREATE TABLE #Stock 
    (id int, product_id varchar(2), quantity int) 
; 

INSERT INTO #Stock 
    (id, product_id, quantity) 
VALUES 
    (1, 'p1', 3), 
    (2, 'p1', 3), 
    (3, 'p2', 2) 
; 


select b.id from 
(select product_id,sum(quantity) sum from #Stock group by product_id) a 
right join #product b on a.product_id=b.id 
where isnull(a.sum,0)<=b.min_stock and b.is_order='y' 
Смежные вопросы