我不确定如何问这个,所以我举个例子
我有一张类似这样的巨大桌子......
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
.
.
我目前的sql语句是......
SELECT name, widgets, TransDate, Location
FROM MyTable
WHERE TransDate BETWEEN 1/1/2011 and 12/31/2011
给我一张这样的桌子......
Name Widgets TransDate Location
Abby 13 1/10/2011 Burmingham
Bobby 15 12/12/2011 Easton
Bobby 5 10/10/2011 Weston
.
.
如何修改上面的SQL,以便除去那些不符合Widget配额X的人的记录...说X = 16.在这种情况下,Abby会被删除,因为她的小部件总数是13和Bobby的记录会留下来,因为他的总数是20。
提前谢谢!
答案 0 :(得分:29)
如果我理解了您的请求,您希望获得与您已经获得的结果类似的结果,但要过滤那些符合配额的名称。如果这是正确的,您可以使用IN()
子查询来查找使用> = 100个小部件分组的名称。
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'
答案 1 :(得分:5)
对于sql server,它可以像这样完成
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'
答案 2 :(得分:0)
对于SQL Server 2005+,您还可以尝试:
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
这是假设配额必须在同一日期框架内进行。