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!
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'
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'
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.