2017-07-14 9 views
1

から販売レコードを増やす私は2つのテーブル に常時取得するテーブルのSQL Server

Product 
    ProdId, ProdName 
    1  A 
    2  B 

Sale 
SaleId, ProdId, Sale, Year 
1,  1,  100, 2012 
2,  1,  130, 2013 
3,  2,  100, 2012, 
4,  1,  150, 2014, 
5,  1,  180, 2015 
6,  2,  120, 2013, 
7,  2,  90, 2014, 
8,  2,  130, 2015 

私は販売に常時増加している製品の名前をしたいを持っています。 のような商品 "A"は2012年のような販売記録を持っています - 100単位、2013 - 130単位、2014 - 150単位、2015 - 180単位、不連続記録のもう1つのケースは、販売記録2012 - 100単位、2013 - 120単位、2014 - 90単位、2015 - 130単位を持つ製品 "B"です。

商品「A」のようなレコードが欲しいです。

ヘルプありがとうございます。

+0

各製品のレコードを検索し、年ごとの違いを見つけるためにループします。差が常に肯定的である場合、あなたはあなたの製品を持っています。 –

+3

ひどいアドバイス@VarunMehta – scsimon

+0

年間売上の変化の平均を望みますか?毎年肯定的な変化を遂げる製品を展示するには? – EMUEVIL

答えて

1

cross applyを使用して、前年の売却額を取得し、増加する金額条件について条件付き集計でチェックします。

select prodid 
from sale s1 
cross apply (select sale as prev_sale 
      from sale s2 
      where s1.prodid=s2.prodid and s2.year=s1.year-1) s2 
group by prodid 
having sum(case when sale-prev_sale<0 then 1 else 0 end) = 0 

、このようPRODIDさんのためのすべての行を取得

select * from sale 
where prodid in (select prodid 
       from sale s1 
       cross apply (select sale as prev_sale 
           from sale s2 
           where s1.prodid=s2.prodid and s2.year=s1.year-1) s2 
       group by prodid 
       having sum(case when sale-prev_sale<0 then 1 else 0 end) = 0 
       ) 
1

を使用するには、ここでCTE

declare @sale table (SaleID int, ProdId int, Sale int, Year int) 
insert into @sale 
values 
(1,1,100,2012), 
(2,1,130,2013), 
(3,2,100,2012), 
(4,1,150,2014), 
(5,1,180,2015), 
(6,2,120,2013), 
(7,2,90,2014), 
(8,2,130,2015) 

declare @product table (ProdID int, ProdName char(1)) 
insert into @product 
values 
(1,'A'), 
(2,'B') 

;with cte as(
select 
    row_number() over (partition by ProdId order by Year) as RN 
    ,* 
from @sale) 

select 
    p.ProdName 
    ,cte.* 
from cte 
inner join 
    @product p on 
    p.ProdID=cte.ProdId 
where cte.ProdId IN 
    (select distinct 
     c1.ProdId 
    from cte c1 
     left join 
     cte c2 on c2.RN = c1.rn+1 and c2.ProdId = c1.ProdId 
    group by c1.ProdId 
    having min(case when c1.Sale < isnull(c2.Sale,999999) then 1 else 0 end) = 1) 

RETURNS

+----------+----+--------+--------+------+------+ 
| ProdName | RN | SaleID | ProdId | Sale | Year | 
+----------+----+--------+--------+------+------+ 
| A  | 1 |  1 |  1 | 100 | 2012 | 
| A  | 2 |  2 |  1 | 130 | 2013 | 
| A  | 3 |  4 |  1 | 150 | 2014 | 
| A  | 4 |  5 |  1 | 180 | 2015 | 
+----------+----+--------+--------+------+------+ 
2

することができますと方法ですこれを使用してrow_number() 2回:

select prod_id 
from (select s.*, 
      row_number() over (partition by s.prod_id order by sale) as seqnum_s, 
      row_number() over (partition by s.prod_id order by year) as seqnum_y 
     from sales s 
    ) s 
group by prod_id 
having sum(case when seqnum_s = seqnum_y then 1 else 0 end) = count(*); 

つまり、年と売上高による注文です。すべての行番号が同じ場合、売上高は増加しています。

注:結束した売上高が増加すると考えられる場合があります。これは、そのような状況を除外または含むことによって、論理によって処理することができます。私はあなたの質問がその状況で何をすべきか明確ではないので、これについての論理を含んでいません。

+1

ベスト回答IMHO。良いアイデア – scsimon

関連する問題