これを尋ねる方法が正確にわからないので、例を挙げます
次のような巨大なテーブルがあります...
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を変更して、ウィジェットクォータXを満たさない人のレコードも削除する方法を教えてくださいX ... X = 16と言う。彼の合計が20であるため、レコードは残ります。
前もって感謝します!
リクエストを理解した場合、既に取得しているものと同様の結果が得られますが、クォータを満たしている名前をフィルタリングできます。それが正しい場合は、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'
sQLサーバーの場合、次のように実行できます
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'
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
これは、クォータが同じ日付枠で満たされる必要があることを前提としています。