Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Shlippenbaranus Member Откуда: Сообщений: 241 |
Добрый день, подскажите, пожалуйста. Делаю так: create table #tmp (a int, b int, c int) insert into #tmp values (1,2,3),(1,3,4),(1,4,5),(2,3,4),(2,4,5) select b, count(1) from #tmp group by b- получаю очевидный результат:
Пытаюсь его транспортировать при помощи pivot: select [2],[3],[4],[5] from #tmp pivot ( count(a) for b in ([2],[3],[4],[5]) ) a- получаю вот это:
Почему здесь три строки, а не одна? |
||||||||||||||||||||||||||
4 апр 13, 16:59 [14136898] Ответить | Цитировать Сообщить модератору |
Паганель Member Откуда: Винница Сообщений: 22551 |
select [2],[3],[4],[5] from (select a, b from #tmp) as t pivot ( count(a) for b in ([2],[3],[4],[5]) ) a |
4 апр 13, 17:02 [14136915] Ответить | Цитировать Сообщить модератору |
Shlippenbaranus Member Откуда: Сообщений: 241 |
Спасибо! Т.е. pivot делает "group by" по всем столбцам таблицы, не фигурирующим в его определении, безотносительно к тому, выбираются ли они в select-части запроса. "Синтаксис оператора PIVOT является более простым и понятным, чем синтаксис, который может выполнить то же действие с помощью последовательности инструкций SELECT...CASE" (тут) - хи-хи. |
4 апр 13, 17:36 [14137087] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Что хи-хи ? Базовый пример PIVOT из ссылки - один в один воспроизводит ваш пример. |
||
4 апр 13, 17:41 [14137108] Ответить | Цитировать Сообщить модератору |
Shlippenbaranus Member Откуда: Сообщений: 241 |
Кстати, такая вот вещь синтаксически недопустима:select [2],[3],[4],[5] from #tmp pivot ( count(a) for b in ([2],[3],[4],[5]) ) a where b < 5 Хотя вот такая - вполне: select [2],[3],[4],[5] from #tmp pivot ( count(a) for b in ([2],[3],[4],[5]) ) a where c < 5 |
4 апр 13, 17:41 [14137109] Ответить | Цитировать Сообщить модератору |
Shlippenbaranus Member Откуда: Сообщений: 241 |
Базовый пример из ссылки воспроизводит пример Паганеля, а не мой. "Хи-хи" в том смысле, что простым и понятным я бы такое поведение не называл. Хотя признаю: в документации оно таки описано. Плюс, не могу не признать, что по первой из ссылок "простым и понятным" назван именно синтаксис, а не поведение :). Классическая фишка от MS. |
||||
4 апр 13, 18:27 [14137354] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
Ага-ага SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost FROM Production.Product GROUP BY DaysToManufacture; Ниже приводится результирующий набор. DaysToManufacture AverageCost 0 5.0885 1 223.88 2 359.1082 4 949.4105 select b, count(1) from #tmp group by b - получаю очевидный результат: b (No column name) 2 1 3 2 4 2 Как говорится - найдите 10 отличий |
||
4 апр 13, 21:22 [14137880] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |