SQL выбирает все записи, только если сумма больше 100 - PullRequest
11 голосов
/ 12 января 2012

Я не совсем уверен, как это спросить, поэтому приведу пример

У меня есть огромный стол, который напоминает что-то вроде этого ...

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 = 16. В этом случае Эбби будет отброшена, потому что ее общее количество виджетов равно 13, и записи Бобби останутся, потому что его общее количество составляет 20.

Заранее спасибо!

Ответы [ 3 ]

29 голосов
/ 12 января 2012

Если я понимаю ваш запрос, вы хотите получить результаты, аналогичные уже полученным, но с фильтрацией по тем именам, которые выполнили квоту.Если это так, вы можете использовать подзапрос 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'
5 голосов
/ 12 января 2012

для сервера 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'
0 голосов
/ 12 января 2012

Для 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

Предполагается, что квота должна быть введена в один и тот же период.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...