2017-08-17 5 views
4
product  saletype qty 
----------------------------- 
product1 regular  10 
product1 sale  1 
product1 feature  2 

私は上記の販売表を持っており、製品は3つの異なる方法(通常価格、販売価格、または機能価格)のうちの1つを販売することができます。同じ表の他の特定の行のみから特定の行のみを集計しますか?

タイプに関係なく、すべての販売は正規に蓄積されますが、販売と機能も独自の「saletype」に蓄積されます。したがって、上記の例では、合計10商品(通常7、販売1、機能2)を販売しています。

可能な限り効率的に他の2つの列を差し引いた正規量と、他のsaletypeも返したいと思います。

create table query_test 
(product varchar(20), saletype varchar(20), qty int); 

insert into query_test values 
('product1','regular',10), 
('product1','sale',1), 
('product1','feature',2) 

select 
    qt.product, 
    qt.saletype, 
    CASE WHEN qt.saletype = 'regular' THEN sum(qt.qty)-sum(lj.qty) ELSE sum(qt.qty) END as [qty] 
from 
    query_test qt 
    left join 
    (
     select product, sum(qty) as [qty] 
     from query_test 
     where saletype in ('sale','feature') 
     group by product 
    ) lj on lj.product=qt.product 
group by 
    qt.product, qt.saletype; 

...私は後にしています何を得ている:私は基本的に同じ情報を照会することよりも、もっと良い方法がなければならないような気がし

product  saletype qty 
----------------------------- 
product1 feature  2 
product1 regular  7 
product1 sale  1 

しかし、ここでは、私は現在、それをやっている方法です二度。

答えて

2

窓関数sumとこれを行うためのいくつかの算術演算を使用できます。

select product, 
saletype, 
case when saletype='regular' then 2*qty-sum(qty) over(partition by product) 
else qty end as qty 
from query_test 

これは、saletype 'regular'には1行が存在することを前提としています。

関連する問題