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

Можно ли с помощью запроса решить подобную задачу?
Имеется таблица

id user logdate
1 oleg 17.10.2012 17:11:06
2 oleg 17.10.2012 17:11:07
3 oleg 18.10.2012 17:11:08
4 bapr 18.10.2012 17:05:06
5 bapr 17.10.2012 17:11:06


Надо привести ее к следующему виду

id user logdate id_1 user_1 logdate_1
1 oleg 17.10.2012 17:11:06 4 bapr 18.10.2012 17:05:06
2 oleg 17.10.2012 17:11:07 5 bapr 17.10.2012 17:11:06
3 oleg 18.10.2012 17:11:08 NULL NULL NULL


то есть пары [user] - [logdate] вывести отдельными столбцами. Количество юзеров (поле [user]) может быть разное
29 окт 12, 13:19    [13390287]     Ответить | Цитировать Сообщить модератору
 Re: Самообъединение таблицы  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
vladanich
Можно ли с помощью запроса решить подобную задачу?

Можно.

vladanich
Количество юзеров (поле [user]) может быть разное

Динамический SQL.
29 окт 12, 13:26    [13390357]     Ответить | Цитировать Сообщить модератору
 Re: Самообъединение таблицы  [new]
vlad anich
Member

Откуда:
Сообщений: 2
А каким образом, можно поподробнее? Пробовал с помощью PIVOT/UNPIVOT крутить, но это мне кажется не тот случай.
Еще вариант тупо так сделать:

select * from  
(select * from dbo.t1 where [user]='oleg') t1
full join
(select * from dbo.t1 where [user]='bapr') t2
on t1.id=t2.id

,но если много пользователей, то и много join'ов будет. Может проще как-то можно это сделать?
29 окт 12, 15:43    [13391808]     Ответить | Цитировать Сообщить модератору
 Re: Самообъединение таблицы  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2996
Как "развернуть" таблицу или построить cross-tab отчет?
29 окт 12, 15:56    [13391906]     Ответить | Цитировать Сообщить модератору
 Re: Самообъединение таблицы  [new]
tetxx
Member

Откуда:
Сообщений: 297
Можно еще так:
set dateformat dmy;
declare @col int = 2;/*2 - количество колонок*/
declare @test table (id int, name varchar(10), dt datetime)

insert into @test
values
(1,'oleg',cast('17.10.2012 17:11:06' as datetime)),
(2 ,'oleg',cast('17.10.2012 17:11:07' as datetime)),
(3 ,'oleg',cast('18.10.2012 17:11:08' as datetime)),
(4,'bapr',cast('18.10.2012 17:05:06' as datetime)),
(5 ,'bapr',cast('17.10.2012 17:11:06' as datetime))

;with test as (
  /*тут текст запроса*/
  select *
  from @test
)
select t1.*, t2.*
from (
  select id, Ry, ROW_NUMBER()over(partition by ry order by id) Rx
  from (
    select *, ceiling(ROW_NUMBER()over(order by id)/ceiling(cast(COUNT(*)over() as numeric(15,3))/@col)) Ry
    from test
  ) t
)t
pivot(max(id) for Ry in ([1],[2]))pvt
left join test t1 on t1.id = pvt.[1]
left join test t2 on t2.id = pvt.[2]
29 окт 12, 17:16    [13392487]     Ответить | Цитировать Сообщить модератору
 Re: Самообъединение таблицы  [new]
tetxx
Member

Откуда:
Сообщений: 297
Да и потом, зачем тут pivot?
;with test as (
  /*тут текст запроса*/
  select *
  from @test
)
,result as (
	select *, ROW_NUMBER()over(partition by ry order by id) rx
	from (
	  select *, ceiling(ROW_NUMBER()over(order by id)/ceiling(cast(COUNT(*)over() as numeric(15,3))/@col)) ry
	  from test
	) t
)
select r1.*, r2.*
from result r1
left join result r2 on r2.rx = r1.rx and r2.ry=2
where r1.ry = 1
29 окт 12, 17:23    [13392538]     Ответить | Цитировать Сообщить модератору
 Re: Самообъединение таблицы  [new]
user89
Member

Откуда:
Сообщений: 2083
vladanich,

пример с динамическим SQL. Я тут добавил еще одно пользователя.

set nocount on
set dateformat dmy

create table #t (id int, UserName varchar(500), dt datetime)
insert into #t values
(10,'oleg',cast('16.10.2012 16:11:06' as datetime)), (11,'oleg',cast('16.10.2012 16:11:07' as datetime)), (12,'oleg',cast('16.10.2012 16:11:08' as datetime)),
(5,'bapr',cast('17.10.2012 17:05:06' as datetime)), (6,'bapr',cast('17.10.2012 17:11:06' as datetime)), (30,'ttt',cast('18.10.2012 18:20:06' as datetime))

select * from #t

declare @s varchar(max)
;with tmp as (select UserName, count(*) [cnt] from #t group by UserName)
select @s = stuff((select ',case when (max(case when UserName = ''' + UserName + ''' then dt else null end)) is not null then ''' + UserName + ''' else null end [user'
 + cast(row_number() over(order by cnt desc) as varchar(50)) + ']' + char(10) + ',max(case when UserName = ''' + UserName + ''' then dt else null end) [' + UserName + ']' + char(10)
from tmp for xml path('')), 1,1,'')

select @s = ';with a as (select *, row_number() over(partition by UserName order by UserName) [rn] from #t)' + char(10) + 'select' + char(10) + @s + 'from a' +
char(10) + 'group by rn'

print @s
exec(@s)


drop table #t
30 окт 12, 10:06    [13394850]     Ответить | Цитировать Сообщить модератору
 Re: Самообъединение таблицы  [new]
vlad anich
Member

Откуда:
Сообщений: 2
Всем большое спасибо, проблема решена)
6 ноя 12, 13:57    [13426470]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить