Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Достать распределение


Автор: hello19 11.9.2014, 19:55
Привет всем!
Мне нужно рассчитать распределение количества пользователей за определенный промежуток времени для каждого сайта.

Написал запрос для определения того, какой пользователь на какой ресурс заходил за определенный временной промежуток. Полученный результат выглядит как-то так:

Код

+-----------+---------------------+-------------------+
|  site_id  | visitor_id          | count(visitor_id) |
+-----------+---------------------+-------------------+
|         8 |  353389751327572831 |              1120 |
|         8 | 8248747651386193561 |              1005 |
|         8 | 1773132781390152736 |               957 |
|         8 |  501663501391419490 |               936 |
|         5 | 1231874741355575425 |               925 |
|         5 | 2078329811388561752 |               904 |
|         2 | 7565480111354343102 |               875 |
|         2 |  997915071394432214 |               870 |
|         2 | 2363204321364319637 |               869 |
|         2 |   17474831359576968 |               866 |
+-----------+---------------------+-------------------+


Осталось из этого достать распределение по частоте и отобразить его в таком вот виде:
Код

    site_ID        1    2    3    4    5
    ----------    ---  ---  ---  ---  ---
    1             967  576  856  234  
    2             576  947  847  987  324
    .
    .

Частоту хочу задавать не конкретным числом, а интервалом и держать его в табличке:
Код

create temporary table ranges (
   s int not null,
   e int not null
);

insert into ranges (s, e) values
   (0, 10),
   (11, 20),
   (21, 30),
   (31, 40),
   (41, 50),
   (51, 100),
   (101, 300),
   (301, 500),
   (501, 1000),
   (1001, 1500),
   (1500, 10000)
;


Помогите разобраться как сделать так, чтобы результат отображался "в строчку" и при этом не приходилось бы сильно менять код, в случае если понадобятся другие интервалы... 

Автор: Zloxa 11.9.2014, 20:26
Цитата(hello19 @  11.9.2014,  20:55 Найти цитируемый пост)
 чтобы результат отображался "в строчку"

Это не про SQL. Основная парадигма стуктуированного языка запросов - структура результата не зависит от состава данных. Но суровые реалии жизни таки иногда заставляют транспонировать. Обычно это делают с помощью:
1) Внешних средств - формиуют на клиенте или подключают какую нить BI
2) Динамическим построением запроса, т.е. текст запроса формируется программно непосредственно перед выполнением, на основе каких -то данных.
3) Некоторые диалекты уже предоставляют готовые сопелки. К примеру Акцесс. Постгр вроде тоже может. Оракл, МС, My - нет

Автор: hello19 11.9.2014, 20:30
Почему нельзя средствами SQL? Вот есть же PIVOT, например... только не знаю как там уйти от того, чтобы вручную вписывать названия стобцов.

Автор: Zloxa 11.9.2014, 21:13
Цитата(hello19 @  11.9.2014,  21:30 Найти цитируемый пост)
только не знаю как там уйти от того, чтобы вручную вписывать названия стобцов. 

Динамически формируя текст запроса.
Цитата(hello19 @  11.9.2014,  21:30 Найти цитируемый пост)
Почему нельзя средствами SQL? 

Потому что основная парадигма SQL - структура результата не зависит от состава данных. smile

Добавлено через 25 секунд
Цитата(hello19 @  11.9.2014,  21:30 Найти цитируемый пост)
Вот есть же PIVOT, например... 

он есть не везде. Озвучте уже платформу чтоли

Автор: hello19 11.9.2014, 21:15
Цитата(Zloxa @  11.9.2014,  21:13 Найти цитируемый пост)
Цитата(hello19 @  11.9.2014,  21:30 )
только не знаю как там уйти от того, чтобы вручную вписывать названия стобцов. 

Динамически формируя текст запроса.


А пример можно увидеть как это сделать?

Автор: Zloxa 11.9.2014, 21:25
Цитата(hello19 @ 11.9.2014,  22:15)
Цитата(Zloxa @  11.9.2014,  21:13 Найти цитируемый пост)
Цитата(hello19 @  11.9.2014,  21:30 )
только не знаю как там уйти от того, чтобы вручную вписывать названия стобцов. 

Динамически формируя текст запроса.


А пример можно увидеть как это сделать?

Для этого прийдется использовать какой-то процедурный язык. Похапэ там, делфи, сишарп, pl/sql и прпр - на чем вы там пишите. Обычно при составлении динамическом формировании текста запроса очень активно используют конкатенацию  smile 

Автор: hello19 11.9.2014, 21:31
Я пишу запрос на sql.. 
Гугл что-то выдает на запрос "sql вывод строк столбцами", разбираюсь. Правда пока безрезультатно.
И не нужно вкапываться так..

Автор: Zloxa 11.9.2014, 21:36
Цитата(hello19 @  11.9.2014,  22:31 Найти цитируемый пост)
Я пишу запрос на sql.. 

1) Язык sql насчитвает сто пяццот диалектов. В нектоторых можно динамически транспонировать, в большинстве нет - Для какой платформы вы пишите - Оракл, МS SQL, Interbase?

2) Для того, чтобы динамически сформировать SQL запрос, вероятнее всего прийдется использовать какой-то иттеративный язык прогаммирования. Можно сформировать текст SQL запроса и средствами SQL, но это, как правило - просто извращение

Автор: Akina 12.9.2014, 08:07
Цитата(Zloxa @  11.9.2014,  22:36 Найти цитируемый пост)
Можно сформировать текст SQL запроса и средствами SQL, но это, как правило - просто извращение

Хотя большинство диалектов предоставляют средства выполнения текста запроса из литерала/переменной... lamer-friendly interface...

Автор: Zloxa 12.9.2014, 08:10
Цитата(Akina @ 12.9.2014,  09:07)
Цитата(Zloxa @  11.9.2014,  22:36 Найти цитируемый пост)
Можно сформировать текст SQL запроса и средствами SQL, но это, как правило - просто извращение

Хотя большинство диалектов предоставляют средства выполнения текста запроса из литерала/переменной... lamer-friendly interface...

Большинство диалектов имеют процедурные расширения, средствами которых можно и сформировать и исполнить sql.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)