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

Откуда: Москва
Сообщений: 243
Добрый день!
Есть набор строк, который представлен
Name Znache
ID 11111
Ballance 19860.00
APCurrent 6620
APNext 6620
ID 2222
Ballance 7305.00
APCurrent 2435
APNext 2435


Как можно реализовать, чтобы выводилось в таком представлении

ID Ballance APCurrent APNext
11111 19860.00 6620 6620
2222 7305.00 2435 2435
14 ноя 14, 18:26    [16848271]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать  [new]
vova ivanov
Member [заблокирован]

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

поле для сортировки есть ? в каждой группе 4-е записи ?
если 2а "да", то так можно

;with cte as 
	(select Name, Znache, (row_number()over(order by id)-1)/4 as gr from t)

select 
	max(case when Name='ID' then Znache end) as ID,
	max(case when Name='Ballance' then Znache end) as Ballance,
	max(case when Name='APCurrent' then Znache end) as APCurrent,
	max(case when Name='APNext' then Znache end) as APNext
from cte
group by gr
14 ноя 14, 18:57    [16848418]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать  [new]
BKV88
Member

Откуда: Москва
Сообщений: 243
vova ivanov,
В каждой группе 4 записи. Поле для сортировки нету.
Единственное уникальное значение это поле ID
Ума пока не приложу как грамотно к ним приложить row_number
В предоставленном варианте ссылается на Invalid column name 'id'. для строки over(order by id)-1)/4

Вот скрипт для создания искомых значений

Create table t (name varchar(50) null,znache varchar(50) null)
  
  insert into t values ('id','11111')
  insert into t values ('Ballance','19860.00')
  insert into t values ('APCurrent','6620')
  insert into t values ('APNext','6620')
  insert into t values ('id','2222')
  insert into t values ('Ballance','7305.00')
  insert into t values ('APCurrent','2435')
  insert into t values ('APNext','2435')
14 ноя 14, 19:26    [16848574]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать  [new]
vova ivanov
Member [заблокирован]

Откуда:
Сообщений: 1090
BKV88
Поле для сортировки нету.

в таком случае решения нет,
т.е. можно, конечно, сделать так
;with cte as 
	(select Name, Znache, (row_number()over(order by (select 1))-1)/4 as gr from @t)

select 
	max(case when Name='ID' then Znache end) as ID,
	max(case when Name='Ballance' then Znache end) as Ballance,
	max(case when Name='APCurrent' then Znache end) as APCurrent,
	max(case when Name='APNext' then Znache end) as APNext
from cte

но гарантии, что правильный Ballance "ляжет" к правильному ID - ровно 0 !
14 ноя 14, 19:43    [16848692]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать  [new]
BKV88
Member

Откуда: Москва
Сообщений: 243
Добился вот таких данных
1 id 11111
2 Ballance 19860.00
3 APCurrent 6620
4 APNext 6620
5 id 2222
6 Ballance 7305.00
7 APCurrent 2435
8 APNext 2435


Запрос

;with cte as 
	(select Name, Znache, (row_number()over(order by  id-1)/5) as gr from t)



select 
	max(case when Name='ID' then Znache end) as ID,
	max(case when Name='Ballance' then Znache end) as Ballance,
	max(case when Name='APCurrent' then Znache end) as APCurrent,
	max(case when Name='APNext' then Znache end) as APNext
from cte
group by 


Выводит данные

ID Ballance APCurrent APNext
11111 19860.00 6620 6620
2222 7305.00 2435 2435


Данные выводятся верны, но смущает вот это условие (row_number()over(order by id-1)/5) на сколько оно корректно?
15 ноя 14, 11:44    [16850611]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать  [new]
BKV88
Member

Откуда: Москва
Сообщений: 243
И не зря смущает при увеличение результировающего набора где наборов по 4 записи больше двух результат уже съезжает
15 ноя 14, 11:58    [16850638]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать  [new]
BKV88
Member

Откуда: Москва
Сообщений: 243
А так вроде работает

row_number()over(order by id)-1)/8
15 ноя 14, 12:10    [16850669]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать  [new]
BKV88
Member

Откуда: Москва
Сообщений: 243
BKV88,

Вернее row_number()over(order by id)-1)/4
15 ноя 14, 12:12    [16850678]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31964
BKV88
А так вроде работает

row_number()over(order by id)-1)/8
Неправильный это метод, откуда тут деление на 8? Вы вдумайтесь, что тут вообще написано.

Вот правильный вариант, будет работать, даже если в данных пропуски:
Create table #t (id int identity, name varchar(50) null, znache varchar(50) null)
  
  insert into #t(name, znache) values ('id','11111')
  insert into #t(name, znache) values ('Ballance','19860.00')
  insert into #t(name, znache) values ('APCurrent','6620')
  insert into #t(name, znache) values ('APNext','6620')
  insert into #t(name, znache) values ('id','2222')
  insert into #t(name, znache) values ('Ballance','7305.00')
  insert into #t(name, znache) values ('APCurrent','2435')
  insert into #t(name, znache) values ('APNext','2435')
  insert into #t(name, znache) values ('id','3333')
  insert into #t(name, znache) values ('Ballance','17305.00')
  insert into #t(name, znache) values ('APNext','12435')
  insert into #t(name, znache) values ('id','4444')
  insert into #t(name, znache) values ('Ballance','27305.00')
  insert into #t(name, znache) values ('APCurrent','22435')
  insert into #t(name, znache) values ('APNext','22435')

go
;with cte as 
	(select Name, Znache, (select top 1 Znache from #t t1 where t1.Name = 'id' and t1.id <= t.id order by t1.id desc) as gr from #t t)

select ID, Ballance, APCurrent, APNext
from (
	select Name, Znache, gr
	from cte
) t
pivot(
	max(Znache) for Name in ([ID],[Ballance],[APCurrent],[APNext])
) as p
15 ноя 14, 12:30    [16850733]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31964
alexeyvg
Вот правильный вариант, будет работать, даже если в данных пропуски:
Да, тут я исходил из того, что значения тега "ID" уникально. На всякий случай можно поменять, вдруг это не так:
alexeyvg
;with cte as 
	(select Name, Znache, (select top 1 id from #t t1 where t1.Name = 'id' and t1.id <= t.id order by t1.id desc) as gr from #t t)
15 ноя 14, 12:37    [16850750]     Ответить | Цитировать Сообщить модератору
 Re: Как реализовать  [new]
BKV88
Member

Откуда: Москва
Сообщений: 243
alexeyvg,
Спасибо.
15 ноя 14, 12:37    [16850753]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить