web-dev-qa-db-fra.com

SQL sélectionne tous les enregistrements uniquement si la somme est supérieure à 100

Je ne sais pas trop comment demander cela, alors je vais donner un exemple.

J'ai une table énorme qui ressemble à quelque chose comme ça ...

Name Widgets TransDate  Location
Abby  2      12/1/2010  Middleton
Abby  13     1/10/2011  Burmingham
Bobby 10     12/12/2011 Easton
Bobby 5      10/10/2011 Weston
.
.

Et ma déclaration SQL actuelle est ...

SELECT name, widgets, TransDate, Location 
FROM MyTable
WHERE TransDate BETWEEN 1/1/2011 and 12/31/2011

pour me donner une table comme ça ... 

Name Widgets TransDate  Location
Abby  13     1/10/2011  Burmingham
Bobby 15     12/12/2011 Easton
Bobby 5      10/10/2011 Weston
.
.

Comment modifier le code SQL ci-dessus pour supprimer également les enregistrements des personnes ne respectant pas un quota de widgets X ... disons X = 16. Dans ce cas, Abby serait supprimée car son nombre total de widgets est 13 et celui de Bobby les enregistrements resteraient parce que son total est de 20.

Merci d'avance! 

9
user1144191

Si je comprends votre demande, vous voulez des résultats similaires à ceux que vous avez déjà obtenus, mais en filtrant les noms qui ont atteint le quota. Si cela est correct, vous pouvez utiliser une sous-requête IN() pour rechercher les noms groupés avec> = 100 widgets.

SELET name, widgets, TransDate, Location FROM MyTable 
WHERE
  /* IN() subquery for names meeting the quota */
  name IN (
     SELECT name 
     FROM tbl 
     /* If they must have met the quota only during the time window, uncomment below */
     /* Otherwise, omit the WHERE clause to find those who have met the quota at any time */
     /* WHERE TransDate BETWEEN '1/1/2011' and '12/31/2011' */
     GROUP BY name 
     HAVING SUM(widgets) >= 100

  ) 
  AND TransDate BETWEEN '1/1/2011' and '12/31/2011'
28
Michael Berkowski

pour le serveur SQL cela pourrait être fait comme ça

SELECT m.name, m.widgets, m.TransDate, m.Location 
FROM MyTable m
JOIN(SELECT name, SUM(widgets) 
            FROM  MyTable 
            WHERE TransDate BETWEEN '1/1/2011' and '12/31/2011'
            GROUP BY NAME 
            HAVING SUM(widgets) >= 16) x
ON x.NAME = m.NAME
WHERE m.TransDate BETWEEN '1/1/2011' and '12/31/2011'
4
SQLMenace

Pour SQL Server 2005+, vous pouvez également essayer:

SELECT name, widgets, TransDate, Location
FROM (
       SELECT name, widgets, TransDate, Location, SUM(widgets) OVER(PARTITION BY Name) Quant
       FROM MyTable
       WHERE TransDate BETWEEN 1/1/2011 and 12/31/2011) A
WHERE Quant >= 16

Cela suppose que le quota doit être atteint à la même date.

0
Lamak