0
votes

Calcul du modèle de baratte

J'essaie d'analyser les clients que nous avons fait des affaires avec l'année précédente (2017) mais maintenant cette année (2018). Comment puis-je obtenir les noms des clients qui nous ont rendu à nous en 2018. J'utilise SSMS 2016.

échantillons de données: p> xxx pré>

La requête ci-dessus retourne la requête 2017 Mais rien ne dit si les numéros 2018 ont été filtrés à l'avance ou non. P>

Résultats demandés: P>

Client_ID         Client_Name
  754             postgresql
  344             oracle
  154             toad


0 commentaires

3 Réponses :


2
votes

Vous pouvez utiliser Existe comme xxx

Démo

Vous pouvez également utiliser in () comme xxx


0 commentaires

1
votes

Vous pouvez utiliser n'existe pas code> et une sous-requête corrélée.

SELECT t1.client_id,
       t1.client_name
       FROM my_table t1
       WHERE t1.order_date >= '2017-01-01'
             AND t1.order_date < '2018-01-01'
             AND NOT EXISTS (SELECT *
                                    FROM my_table t2
                                    WHERE t2.client_id = t1.client_id
                                          AND t2.order_date >= '2018-01-01'
                                          AND t2.order_date < '2019-01-01');


0 commentaires

1
votes

Pour accomplir cette tâche, j'utilise généralement la clause "ayant" "bien que si vous avez une grande quantité de données à traiter, vous pourriez avoir besoin de quelque chose de plus efficace.

and min(year(order_date)) < 2018


2 commentaires

Merci, max obtiendra les nouveaux clients aussi bien que l'ancien pour 2018, mais qu'est-ce que min refait à nouveau?


'Min' peut être utilisé pour exclure les clients en fonction de la date de transaction la plus ancienne. Par exemple, si vous vouliez trouver des clients qui sont devenus clients pour la première fois en 2017, se sont poursuivis jusqu'en 2018 et ne continuaient pas votre entreprise en 2019. Ensuite, Min (année (Arrête_date)) = 2017 et Max (Année (Commande_Date)) = 2018 - Je ne l'ai plus inclus pour l'exhaustivité qui peut être trompeuse. Je pense que "max" suffira pour votre besoin.