web-dev-qa-db-ja.com

SQLは、合計が100より大きい場合にのみすべてのレコードを選択します

これを尋ねる方法が正確にわからないので、例を挙げます

次のような巨大なテーブルがあります...

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であるため、レコードは残ります。

前もって感謝します!

12
user1144191

リクエストを理解した場合、既に取得しているものと同様の結果が得られますが、クォータを満たしている名前をフィルタリングできます。それが正しい場合は、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'
31

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'
5
SQLMenace

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

これは、クォータが同じ日付枠で満たされる必要があることを前提としています。

1
Lamak