Я довольно новичок в языке 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
Мои вопросы:
- Почему результирующий набор исключает 2006 год? и
- Почему существуют две строки с 1 значением?
- Как правило
HAVING
определяет, какие строки возвращаются в обоих столбцах?
Благодарим вас заранее.
Я не уверен, что вы сбиваете с толку. Возможно, если бы вы включили 'count (*)' в вывод второго запроса, это было бы очевидно: только строки, в которых 'count (*)' больше 1, включены. –
Весь 2006 год имеет только одну строку для каждой группы.Emp 1 появляется дважды в течение двух разных лет. «HAVING» работает с группами, которые были определены (в «GROUP BY», как комбинация сотрудника и года. – shawnt00