2017-07-14 1 views
1

J'ai 2 tablesobtenir de plus en plus continuosly records de vente de la table serveur sql

Product 
    ProdId, ProdName 
    1  A 
    2  B 

et

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 

Je veux que le nom du produit dont la vente augmente continuellement. Comme produit "A" a vente record comme dans l'année 2012 - 100 unités, 2013 - 130 unités, 2014 - 150 unités, 2015 - 180 unités, Donc, ce produit A a une augmentation continue de la vente. Un autre cas d'enregistrement non continu est le produit "B" ayant un enregistrement des ventes 2012 - 100 Unités, 2013 - 120 Unités, 2014 - 90 Unités, 2015 - 130 Unités, Donc pour le produit "B", ce n'est pas continu.

Je veux des disques comme le produit "A", qui a continuellement la vente croissante.

Aide appréciée.

+0

Recherchez les enregistrements de chaque produit et bouclez-les pour trouver des différences pour chaque année. Si la différence est toujours positive, vous avez votre produit. –

+3

Terrible conseil @VarunMehta – scsimon

+0

Voulez-vous une moyenne du changement de vente par an? ou seulement pour afficher les produits qui ont un changement positif chaque année? – EMUEVIL

Répondre

1

Utilisez cross apply pour obtenir le montant de la vente de l'année précédente et vérifier avec agrégation conditionnelle pour la condition de quantité croissante.

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 

Pour obtenir les toutes les lignes de ces années PRODID, utilisez

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

Voici une manière avec un 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) 

RETOURS

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

Vous pouvez faites cela en utilisant row_number() deux fois:

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(*); 

C'est, pour l'année et les ventes. Lorsque tous les numéros de ligne sont identiques, les ventes augmentent.

Nota: Dans certains cas, les ventes liées pourraient être considérées comme étant à la hausse. Cela peut être géré par la logique - soit en excluant ou en incluant de telles situations. Je n'ai pas inclus de logique pour cela, parce que votre question n'est pas claire sur ce qu'il faut faire dans cette situation.

+1

Meilleure réponse IMHO. Bonne idée – scsimon