0
votes

Meilleure requête pour obtenir la liste des produits qui n'ont eu aucune vente au cours des 90 derniers jours?

Mon code est super maladroit. Pourriez-vous gars s'il vous plaît fournir une meilleure façon d'obtenir le résultat

Tables: Produits et commandes P>

SELECT 
    Products.ProductID
FROM 
    Products 
    JOIN Orders
        ON Products.ProductID = Orders.ProductID    
WHERE 
    Products.ProductID NOT IN (
        SELECT 
            Products.ProductID
        FROM 
            Products 
            JOIN Orders
                ON Products.ProductID = Orders.ProductID
        WHERE 
            Orders.OrderDate >= DATEADD(day, -90, GETDATE())
        GROUP BY 
            Products.ProductID
)
GROUP BY 
    Products.ProductID


0 commentaires

4 Réponses :


1
votes

Comment sur n'existe pas code> et aucune jointure?

select p.*
from products p
where not exists (select 1
                  from orders o
                  where o.product_id = p.product_id and
                        o.orderdate >= dateadd(day, -90, getdate())
                 );


3 commentaires

Bonjour Gordon, merci de répondre. Je suis un débutant absolu. Pourriez-vous s'il vous plaît dites-moi quelle est l'utilisation de '1' après avoir sélectionné. Aussi, puis-je utiliser O.OrderDate> = getDate () - 7


@Jithukarthik A Sélectionnez l'instruction requiert une liste Sélectionnez de colonnes et / ou d'expressions à revenir. Lorsqu'il est utilisé dans un Existe la liste de sélection est ignorée, mais la syntaxe nécessite que vous sélectionniez quelque chose. 1 , 42 ou même null suffira.


@Jithukarthik. . . Le 1 est la chose la plus facile à taper, comme explique Habo. Et oui, SQL Server reconnaît qu'une DateTime moins un entier doit être interprétée comme un nombre de jours. Je suggérerais que comme un commencement, vous n'utilisez pas de tels raccourcis.



0
votes

Je ne suis pas sûr que vous ne pouvez pas inverser votre condition et sélectionner à la place de tous les produits qui avaient des ventes plus tôt ces derniers jours auparavant?

SELECT Products.ProductID 
FROM Products
INNER JOIN Orders ON Products.ProductID = Orders.ProductId
WHERE Orders.OrderDate < DATEADD(day, -90, GETDATE())
GROUP BY Products.ProductID


0 commentaires

0
votes

Essayez ci-dessous ou supprimez simplement votre sous-sélection après la prise de consigne Garder juste Sélectionnez ProductID à partir de produits Rejoignez les commandes sur ... et Ordres.orderdate> = daadd (jour, -90, getDate ()) xxx


2 commentaires

Bonjour, merci pour la réponse. Je veux juste savoir si ces deux filtres ont le même effet où order_date> = daadd (jour, -90, getDate ()) 'et' où order_date> = getDate () -90


En ce qui concerne ses jours d'addition, tout irait bien, mais peut-être peut-être de devenir manuel pour vous en cas de calcul comme des mois ou des années comme une valeur de jours sur l'ajout d'années ou de mois



1
votes

Je pense que l'utilisation d'un CTE pourrait vous donner une solution assez simple.

WITH CTE_ActiveList AS (

  SELECT DISTINCT
     O.ProductID
  FROM 
     Orders O 
  WHERE 
     O.OrderDate >= DATEADD(day, -90, GETDATE()))

SELECT P.ProductID from Product P
LEFT JOIN CTE_ActiveList L
ON P.ProductID = L.ProductID
WHERE L.ProductID IS NULL


0 commentaires