2015-12-16 2 views
1

Я довольно новичок в языке sql, поэтому я читаю книгу Sql Server 2012 T-SQL Fundamentals, чтобы представить себя в этих разделах. Есть два примера, которые я пытаюсь проанализировать, чтобы получить четкое представление о них. Во-первых, автор выполнить следующий запрос:Что такое логическая обработка запросов, сделанная предложением HAVING в SQL?

SELECT 
    empid, 
    YEAR(orderdate) AS orderyear, 
    SUM(freight) AS totalfreight, 
    COUNT(*) AS numorders 
FROM 
    Sales.Orders 
WHERE 
    custid = 71 
GROUP BY 
    empid, YEAR(orderdate); 

, чтобы получить это:

empid  orderyear totalfreight   numorders 
----------- ----------- --------------------- ----------- 
1   2006  126.56    1 
2   2006  89.16     1 
9   2006  214.27    1 
1   2007  711.13    2 
2   2007  352.69    1 
3   2007  297.65    2 
4   2007  86.53     1 
5   2007  277.14    3 
6   2007  628.31    3 
7   2007  388.98    1 
8   2007  371.07    4 
1   2008  357.44    3 
2   2008  672.16    2 
4   2008  651.83    3 
6   2008  227.22    1 
7   2008  1231.56    2 

Но, во 2-ом примере автор запускает следующий запрос:

SELECT 
    empid, YEAR(orderdate) AS orderyear 
FROM 
    Sales.Orders 
WHERE 
    custid = 71 
GROUP BY 
    empid, YEAR(orderdate) 
HAVING 
    COUNT(*) > 1; 

Этот запрос возвращает следующий результат:

empid  orderyear 
----------- ----------- 
1   2007 
3   2007 
5   2007 
6   2007 
8   2007 
1   2008 
2   2008 
4   2008 
7   2008 

Мои вопросы:

  1. Почему результирующий набор исключает 2006 год? и
  2. Почему существуют две строки с 1 значением?
  3. Как правило HAVING определяет, какие строки возвращаются в обоих столбцах?

Благодарим вас заранее.

+0

Я не уверен, что вы сбиваете с толку. Возможно, если бы вы включили 'count (*)' в вывод второго запроса, это было бы очевидно: только строки, в которых 'count (*)' больше 1, включены. –

+0

Весь 2006 год имеет только одну строку для каждой группы.Emp 1 появляется дважды в течение двух разных лет. «HAVING» работает с группами, которые были определены (в «GROUP BY», как комбинация сотрудника и года. – shawnt00

ответ

1

В первом запросе мы видим это:

COUNT(*) AS numorders 

А во втором:

COUNT(*) > 1; 

Во втором запросе, не отображается это значение, но мы можем использовать первый набор результатов, чтобы понять это. Все эти строки не включены во втором запросе:

empid  orderyear totalfreight   numorders 
----------- ----------- --------------------- ----------- 
1   2006  126.56    1 
2   2006  89.16     1 
9   2006  214.27    1 
2   2007  352.69    1 
4   2007  86.53     1 
7   2007  388.98    1 
6   2008  227.22    1 

Почему?

Потому что numorders только 1 и во втором запросе мы запросили строки, где numorders > 1.

Что касается вашего вопроса, HAVING - это версия WHERE, которая работает с функциями (например, COUNT()).

http://www.w3schools.com/sql/sql_having.asp

+0

привет, Draco18s, спасибо за ваш ответ. Я думал, что в том, что предложение имеет только эмпирические и упорядоченные столбцы для фильтрации но, согласно вашему отзыву, HAVING учитывает числовые знаки, хотя он не является частью запроса secod. –

+0

@DaniAya 'numorders' - это просто псевдоним для вызова' COUNT (*) 'в первом запросе, но это то же значение имеет логический эффект во втором. – Draco18s

0

используется HAVING вместе с GROUP BY.

Критерии, используемые в WHERE, применяются ко всем строкам перед агрегацией, а HAVING применяется к агрегированным результатам.

Другими словами: у вас есть два раздела критериев для фильтрации набора данных; перед группировкой, определенной в WHERE, и после группировки, определенной в HAVING.

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