Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос на PIVOT  [new]
Oblom
Member

Откуда: Moscow Square
Сообщений: 635
Задача:

Есть таблица сессий:
 CREATE TABLE Sessions(
SessionId uniqueidentifier,
CreateDate datetime)

Необходимо выдать отчет за определенный период (допустим месяц) вида:
Дата 09.11.2011 10.11.2011 11.11.2011 12.11.2011
Кол-во посещений 10 20 30 40

Классическая задача на PIVOT.
Но насколько я понял по доке в PIVOT надо указывать заранее все столбцы. А что делать, если границы промежутка, то есть кол-во и названия столбцов заранее не известны?
Я вижу как это сделать динамическим запросом, но может есть решения поизящнее?
Ведь задача достаточно часто встречаемая, должна была уже давно всплыть.

Ссылки на похожие темы и тыканье носом в мануал всячески приветствуются.
22 ноя 11, 17:16    [11639332]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на PIVOT  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
только динамика
22 ноя 11, 17:24    [11639403]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на PIVOT  [new]
Oblom
Member

Откуда: Moscow Square
Сообщений: 635
Knyazev Alexey,

жаль :(
22 ноя 11, 17:40    [11639577]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на PIVOT  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
еще можно затянуть эти данные на клиента
и там резвернуть каким-то CrystalReports
22 ноя 11, 17:49    [11639655]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на PIVOT  [new]
Oblom
Member

Откуда: Moscow Square
Сообщений: 635
Паганель
еще можно затянуть эти данные на клиента
и там резвернуть каким-то CrystalReports


Увы, надо на сервере.

А ещё может кто помочь с PIVOT?

Модифицируем вышеуказанную таблицу:
CREATE TABLE Sessions(
SessionId uniqueidentifier,
UserId int,
CreateDate datetime)
Если пользователь авторизован, то UserId - целочисленная ссылка на юзера, если неавторизован - UserId = NULL.

Задача посчитать общее число юзеров, плюс число авторизованых в отчете того же вида:
Дата 09.11.2011 10.11.2011 11.11.2011 12.11.2011
Кол-во посещений 10 20 30 40
Кол-во авторизованных 5 10 15 20

Пишем такой запрос:
SELECT 
convert(nvarchar,CreateDate,104) [Дата],
count(*) [Кол-во посещений],
sum(case when UserId IS NOT NULL then 1 else 0 end) [Кол-во авторизованных]
FROM Sessions
GROUP BY convert(nvarchar,CreateDate,104)

А вот как его развернуть одним PIVOT? В голову не лезет ничего кроме UNION из двух PIVOT, но получается слишком громоздко. Есть более простое решение?
23 ноя 11, 09:57    [11642188]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на PIVOT  [new]
Glory
Member

Откуда:
Сообщений: 104751
Oblom
Есть более простое решение?

Делать на клиенте
23 ноя 11, 10:32    [11642362]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на PIVOT  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Oblom
А вот как его развернуть одним PIVOT? В голову не лезет ничего кроме UNION из двух PIVOT, но получается слишком громоздко. Есть более простое решение?

Непонятно что вы имеете в виду, но на всяк случай можно почитать тут или поискать аналогичные темы.
23 ноя 11, 10:39    [11642418]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на PIVOT  [new]
Oblom
Member

Откуда: Moscow Square
Сообщений: 635
Сделал динамикой + UNION, громоздко, зато работает.
Всем спасибо за помощь
23 ноя 11, 11:58    [11643127]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить