Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как тут работает pivot?  [new]
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
- получаю очевидный результат:

b(No column name)
21
32
42

Пытаюсь его транспортировать при помощи pivot:
    select
      [2],[3],[4],[5] 
    from
      #tmp
    pivot (
      count(a) for b in ([2],[3],[4],[5])
      ) a
- получаю вот это:

2345
1000
0200
0020

Почему здесь три строки, а не одна?
4 апр 13, 16:59    [14136898]     Ответить | Цитировать Сообщить модератору
 Re: Как тут работает pivot?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
    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]     Ответить | Цитировать Сообщить модератору
 Re: Как тут работает pivot?  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
Спасибо!

Т.е. pivot делает "group by" по всем столбцам таблицы, не фигурирующим в его определении, безотносительно к тому, выбираются ли они в select-части запроса.

"Синтаксис оператора PIVOT является более простым и понятным, чем синтаксис, который может выполнить то же действие с помощью последовательности инструкций SELECT...CASE" (тут) - хи-хи.
4 апр 13, 17:36    [14137087]     Ответить | Цитировать Сообщить модератору
 Re: Как тут работает pivot?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Shlippenbaranus
хи-хи.

Что хи-хи ?
Базовый пример PIVOT из ссылки - один в один воспроизводит ваш пример.
4 апр 13, 17:41    [14137108]     Ответить | Цитировать Сообщить модератору
 Re: Как тут работает pivot?  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Как тут работает pivot?  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
Glory
Shlippenbaranus
хи-хи.

Что хи-хи ?
Базовый пример PIVOT из ссылки - один в один воспроизводит ваш пример.


Базовый пример из ссылки воспроизводит пример Паганеля, а не мой. "Хи-хи" в том смысле, что простым и понятным я бы такое поведение не называл. Хотя признаю: в документации оно таки описано. Плюс, не могу не признать, что по первой из ссылок "простым и понятным" назван именно синтаксис, а не поведение :). Классическая фишка от MS.
4 апр 13, 18:27    [14137354]     Ответить | Цитировать Сообщить модератору
 Re: Как тут работает pivot?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Shlippenbaranus
Базовый пример из ссылки воспроизводит пример Паганеля, а не мой. "Хи-хи"

Ага-ага

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 Ответить