从表sql server获得持续增加的销售记录

时间:2017-07-14 21:07:23

标签: sql sql-server sql-server-2008 stored-procedures

我有2张桌子

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个单位,因此该产品A的销售额持续增长。另一个非连续记录的案例是,产品“B”具有销售记录2012 - 100个单位,2013 - 120个单位,2014 - 90个单位,2015 - 130个单位,因此对于产品“B”,它不是连续的。

我想要产品“A”这样的记录,他们正在不断增加销售。

帮助表示赞赏。

3 个答案:

答案 0 :(得分:2)

您可以使用row_number()两次执行此操作:

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 :(得分: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

要获取此类产品的所有行,请使用

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
                ) 

答案 2 :(得分: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)

<强>返回

+----------+----+--------+--------+------+------+
| 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 |
+----------+----+--------+--------+------+------+