我有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”这样的记录,他们正在不断增加销售。
帮助表示赞赏。
答案 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 |
+----------+----+--------+--------+------+------+