2010-05-07 5 views
1

В настоящий момент я работаю над макетной бумагой для экзамена, однако у меня нет набора правильных ответов, и я не уверен, какой правильный ответ этого SQL-запроса.Каков результат этого SQL-запроса?

Учитывая таблицу:

foo, bar 
a , 1 
b , 3 
a , 2 
c , 1 

и запрос:

SELECT foo, sum(bar) 
FROM table 
GROUP BY foo 

два способа я могу видеть это происходит либо:

a 3 
a 3 
b 3 
c 1 

или

a 3 
b 3 
c 1 

Спасибо.

ответ

3

GROUP BY объединяет все строки, которые имеют одинаковые имена значений в GROUP BY. SUM сообщает, что делать со значениями, не указанными в GROUP BY.

foo, bar 
a , 1 
b , 3 
a , 2 
c , 1 

SELECT foo, sum(bar) 
FROM table 
GROUP BY foo 

так что вы получите 1 строку для каждого обува: а, Ь и с, и он будет SUM штриховых значений для каждого из этих групп: а (1 + 2), Ь (1), с (1)

и результат в вашем втором наборе результатов:

a 3 
b 3 
c 1 

Поскольку это домашнее задание, вам нужно узнать:

ОТ и РЕГИСТРИРУЙТЕСЬ определить & фильтр строки
ГДЕ более фильтров по строкам
GROUP BY сочетает в себе те строки в группы
HAVING фильтры группы
ORDER BY организует оставшиеся строки/группы

6

Это будет последний.

GROUP BY приведет к объединению набора к значениям foo - по одной линии на каждую. Агрегатная функция SUM будет суммировать значения столбцов bar.

+0

SQL достаточно умный, чтобы одновременно не свернуть разные результаты? Как и в случае, если сумма была различной для разных а, они не были бы объединены каким-либо образом – Martin

+0

@Martin. Сумма всех значений 'bar', связанных с' a', всегда будет одинаковой. Тот факт, что есть другие строки между строками 'a', не важен. – Oded

+0

@martin, что не может случиться, так как будет только одна сумма для a. Все «a» будут иметь суммарное значение бара, дающее один результат для группы «a». Который не является какой-либо конкретной «a» строкой –

2

Это одно:

SELECT foo, sum(bar) 
FROM table 
GROUP BY 
     foo 

даст:

a 3 
b 3 
c 1 

Это один:

SELECT foo, SUM(bar) OVER (PARTITION BY foo) 
FROM table 

даст:

a 3 
a 3 
b 3 
c 1 
2

группа будет вступать в силу сначала, поэтому «вычисления» будут выглядеть следующим образом:

первая группа всех строк по значению foo. давая вам

  • group1: а, 1 а, 2
  • Group2: б, 3
  • Group3: с, 1

затем производят строку результата для каждой группы, основанной на сумма суммарной функции. То есть суммирование значения бара для каждой группы т.е.

  • в, 3
  • б, 3
  • с, 1
1

Запрос:

select foo, sum(bar) 
from table 
group by foo 

даст вы второй комплект выходных данных:

a 3 
b 3 
c 1 

, но не обязательно в указанном порядке. Он также может предоставить вам эти три строки в любом другом порядке. В предложении group by не указывается порядок возврата строк.

+0

FWIW, 'GROUP BY' задает заказ в' MySQL', если не добавлено 'ORDER BY NULL'. – Quassnoi

+1

Я предпочитаю кодировать стандарт, если это абсолютно необходимо. Я не люблю полагаться на поведение одной СУБД, а затем обнаруживать, что она ломается, когда я хочу двигаться - вот как продавцы получают свой замок. – paxdiablo

Смежные вопросы