2016-02-05 2 views
0

В чем разница между двумя SQL-запросами ниже, чем Query2, возвращающим дополнительное поле? Существуют ли какие-либо возможные сценарии, где выход из двух запросов будет отличаться (кроме дополнительного поля в Query2)Разница в выходе из двух SQL-запросов

QUERY1:

SELECT Field1, COUNT(*) 
FROM Table1 
GROUP BY Field1 
HAVING COUNT(*) > 1 

QUERY2:

SELECT Field1, Field2, COUNT(*) 
FROM Table1 
GROUP BY Field1, Field2 
HAVING COUNT(*) > 1 
+0

Запрос 1 является синтаксически неправильным. Обычно они возвращают разные числа строк. Эти два действительно мало связаны друг с другом. –

+0

1,1 | 1,2. Эти 2 записи показывают вам пример различного вывода. – pkExec

+2

Каждый раз, когда имеется несколько значений Field2 для любого значения Field1, вы получите разные результаты. –

ответ

4

Безусловно, они являются другой. Предложение Query2 Group By указывает дополнительное поле. Это означает, что при агрегировании результатов они будут агрегированы для комбинированных уникальных значений Field1 AND Field2. То есть, две записи агрегируются тогда и только тогда, когда оба поля 1 и Поле 2 равны.

Например:

SELECT Profession, Count(*) 
FROM People 
GROUP BY Profession 
HAVING Count(*) > 1 

будет возвращать список профессий с соответствующими пунктами как:

Software Developer, 10 
PM, 5 
Tester, 2 

тогда:

SELECT Profession, Gender, Count(*) 
FROM People 
GROUP BY Profession, Gender 
HAVING Count(*) > 1 

будет возвращать список профессий с разбивкой по пол как:

Software Developer, Male, 5 
Sofware Developer, Female, 5 
PM, Male, 3 
PM, Female, 2 
Tester, Male, 2 

Редактировать дополнительную запрашиваемую информацию:

Вы можете получить отсчеты профессий с рядами для обоих полов через:

SELECT Profession, Count(*) 
FROM People 
GROUP BY Profession 
HAVING SUM(case Gender when 'Female' then 1 else 0 end) > 0 AND SUM(case Gender when 'Male' then 1 else 0 end) > 0 

Это становится немного волосатые (нужно подзапросы), если необходимо также связанный пол counts

+0

Большое спасибо за то, что нашли время, чтобы объяснить. Ты обалденный. Есть ли способ, я могу вернуть ТОЛЬКО строки, разбитые Field2? Пример: В последнем наборе результатов в вашем ответе, как я могу вернуть только те профессии, для которых есть ОБЩИЕ данные о мужчинах и женщинах? (т. е. в примере строка для Tester не будет возвращена, так как она имеет только данные для Male) – slayernoah

+0

Конечно, я обновил свой ответ с дополнительной информацией – ChiralMichael

+0

Спасибо! Но можно ли это сделать, не указывая возможные значения для поля 2 в коде? В таблице, которая у меня есть, существует много возможных значений для Field2 – slayernoah

0

Дополнительная группа по запросу в запросе 2 фильтра записей. Чтобы узнать больше, посмотрите ниже пример.

тестовых данных:

id name 
1 a 
2 b 
3 a 
4 a 

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

select name,sum(id) 
from test 
group by name 

--first фильтр из различные значения для группы по колонкам (здесь название)

a 

b 

- для каждой отдельной записи, как m любые значения попадают в эту категорию.

a 1 a 
    4 a 
    3 a 

b 2 b 

Так из указанных выше групп, теперь вы можете рассчитать любые скопления на группе в нашем случае, это сумма, так что следующий выход будет некоторые вещи, как этот

a 8 

b 2 

Как вы можете видеть сверху выход, вы также можете вычислить, какой-либо агрегации на группы (здесь а и Ь значения), как дать мне считать (идентификатор), длина (имя) на группы, как показано ниже

select name,len(name),sum(id) 
from test 
group by name 

То же самое происходит, когда вы группа по ано ь еще поле, позволяет сказать, как показано ниже

select id,name 
from 
test 
group by id,name 

так и в описанном выше случае, SQL первые фильтры alldistinct записи для идентификатора, имя

1 a 
2 b 
3 a 
4 a 

следующий шаг, чтобы получить записи, которые попадают для каждой группы

groupby columns --columns which fall into this 
1 a    1 a 
2 b    2 b 
3 a    3 a 
4 a    4 a 

Теперь вы можете рассчитать aggergations над группами. Надеюсь, это поможет визуализировать вашу группу. Кроме того, вы будете устранять группы после групповой фазы, где будет устранена запись до группы по фазе

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