2
votes

Requête SQL Trouver tous les produits dont la valeur a augmenté à certaines dates 2

Je me demande si je peux faire cela en utilisant une requête SQL. J'ai une table appelée "data" qui contient le nom du produit, la date et le numéro de vente.

ma table ressemble à ceci:

Product         date       Sale

apple           1/1/2019   5
apple           2/1/2019   4
apple           3/1/2019   3
apple           4/1/2019   2
apple           5/1/2019   1
orange          1/1/2019   1
orange          2/1/2019   2
orange          3/1/2019   3
orange          4/1/2019   4
orange          5/1/2019   5
pear            1/1/2019   6
pear            2/1/2019   4
pear            3/1/2019   3
pear            4/1/2019   2
pear            5/1/2019   5
strawberry      1/1/2019   6
strawberry      2/1/2019   3 
strawberry      3/1/2019   7  
strawberry      4/1/2019   4
strawberry      5/1/2019   2

Je voudrais définir un SQL requête pour trouver le (s) produit (s) qui ont augmenté le nombre de vente à certaines dates 2.

par exemple trouver tous les produits dont le numéro de vente au 01/03/2019 est supérieur au 01/01/2019 et il devrait renvoyer orange et fraise.

Je suis assez nouveau dans le monde de la programmation et toute aide est appréciée. Merci d'avance!


6 commentaires

Ce n'est pas un site de codage gratuit. Veuillez d'abord partager vos efforts, puis la communauté contribuera à vous aider pour un problème spécifique.


Quel serveur de base de données utilisez-vous?


Je ne connais pas SQL. Mais mon meilleur essai est de SELECTIONNER le produit, la date FROM data WHERE date = xxxx OU date = xxxx. Cela donne un tableau mais je ne sais pas comment faire la comparaison par la suite.


C'est bon. faites-moi savoir quel serveur de base de données utilisez-vous? (Oracle, SQL Server, MySQL?)


J'utilise MySQL ....


1. Corrigez votre schéma. Stockez les dates sous forme de dates. Ensuite, consultez meta.stackoverflow.com/questions/333952/...


3 Réponses :


1
votes

Vous pouvez essayer d'utiliser la sous-requête corrélée

DEMO strong >

select name,sdate,amount from data a where exists 
  (
   select 1 from data b where a.name=b.name and b.sdate in ('1/1/2019','3/1/2019') and b.amount>a.amount
   and a.sdate<b.sdate
  ) 
and a.sdate in ('1/1/2019','3/1/2019')

OUTPUT:

name        sdate               amount
orange      01/01/2019 00:00:00   1
strawberry  01/01/2019 00:00:00   6


2 commentaires

Merci pour votre réponse. Je ne comprends pas très bien ce que sont t1 a et t1 b. Je vais vérifier la sous-requête corrélée et étudier un peu votre code suggéré.


En quel sens une date est-elle plus grande qu'une autre (à l'exception évidente de mon anniversaire)?



0
votes
DECLARE @FasatDate Date ='3-1-2019'
DECLARE @SecondDate Date ='1-1-2019'

SELECT T1.Product,T1.[date] FasatDate,T1.Sale FasatDateSale,T2.[date] SecondDate,T2.Sale SecondDateSale FROM (
SELECT * FROM DATA AS [DA]
WHERE [DA].[date]=@FasatDate) T1

INNER JOIN  (
SELECT * FROM DATA AS [DA]
WHERE [DA].[date]=@SecondDate)T2
on
t1.Product = t2.Product AND t1.Sale>t2.Sale

0 commentaires

0
votes

Vous pouvez le faire en tant que JOIN , mais je recommanderais:

select product
from t
where t.date in ('1/1/2019', '3/1/2019')
group by product
having (sum(case when t.date = '1/1/2019' then sales end) <
        sum(case when t.date = '3/1/2019' then sales end)
       );

Remarque: vous devez utiliser des formats de date standard pour vos constantes de date - soit '2019-01-03' ou '2019-03-01 ' selon ce que vous voulez dire.

Vous pouvez également le faire en utilisant l'agrégation:

select t1.*, t2.sales
from t t1 join
     t t2
     on t2.product = t1.product and
        t2.sales > t1.sales
where t1.date = '1/1/2019'
      t2.date = '3/1/2019';


0 commentaires