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

Откуда:
Сообщений: 73
Всем привет.
Можете подсказать как написать запрос к следующему интересному заданию:
Есть диамическая по полям таблица, которая раз в день пересобирается:
col1...col N-1col N
1...11
2...21
............
2...33

мне нужно все значения полей этой таблицы собирать в одно:
colcol Nane
1col1
2col1
...col1
2col1
......
1col N-1
2col N-1
...col N-1
3col N-1
1col N
1col N
...col N
3col N

в принципе, [col Name] можно не передавать.
Спасибо
8 дек 17, 11:55    [21017646]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "горизонтально-вертикальный" запрос?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20174
UNPIVOT
8 дек 17, 12:01    [21017670]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "горизонтально-вертикальный" запрос?  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Aleksey br,

Офигеть вы данные нарисовали - одни 1 и 2, и как разобраться в том, что из чего получилось?

1. Самое правильное - взять исходные данные ( "диамическая по полям таблица, которая раз в день пересобирается" ) и работать с ними.
2. Ну а если нет, изучайте CROSS / OUTER APPLY
SELECT
  col1, col2
FROM
  t
;
SELECT
  ss.[col],
  ss.[val]
FROM
  t
  CROSS APPLY (
    SELECT
      [col] = 'col1',
      [val] = t.[col1]
    UNION ALL
    SELECT
      [col] = 'col2',
      [val] = t.[col2]
  ) ss
8 дек 17, 12:06    [21017682]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "горизонтально-вертикальный" запрос?  [new]
iii2
Member

Откуда:
Сообщений: 202
Какие Cross Apply то, вы о чем???
Select ID, Col1  [col Name] 
From table1
Union all
Select ID, Col2  [col Name] 
From table1
Union all
Select ID, Col3  [col Name] 
From table1
...
8 дек 17, 12:36    [21017804]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "горизонтально-вертикальный" запрос?  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
iii2,
для размышления...
SELECT
  [name] = CONVERT( NVARCHAR(MAX), [name] ),
  [type] = CONVERT( NVARCHAR(MAX), [type] )
INTO
  #test
FROM
  [master]..[spt_values]
;  
SET STATISTICS IO, TIME ON
SELECT
  [col] = 'name',
  [val] = [name]
INTO
  #t1
FROM
  #test
UNION ALL
  SELECT
  [col] = 'type',
  [val] = [type]
FROM
  #test
;
SELECT
  ss.[col],
  ss.[val]
INTO
  #t2
FROM
  #test v
  CROSS APPLY (
    SELECT
      [col] = 'name',
      [val] = [name]
    UNION ALL
    SELECT
      [col] = 'type',
      [val] = [type]
  ) ss
;
SELECT
  *
INTO
  #t3
FROM
  #test v
  UNPIVOT (
    [val] FOR [col] IN 
      ( v.[name], v.[type] )
  ) ss
;
SET STATISTICS IO, TIME OFF
;
DROP TABLE #t1, #t2, #t3
8 дек 17, 12:51    [21017898]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "горизонтально-вертикальный" запрос?  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
SELECT
  [name] = CONVERT( NVARCHAR(MAX), v1.[name] ),
  [type] = CONVERT( NVARCHAR(MAX), v1.[type] )
INTO
  #test
FROM
  [master]..[spt_values] v1
  CROSS APPLY [master]..[spt_values] v2
;  

Если увеличить количество записей, PIVOT неожиданно вырывается в лидеры.
В общем, требуются комментарии специалистов.
8 дек 17, 12:56    [21017921]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "горизонтально-вертикальный" запрос?  [new]
Жытель Гондураса
Member [заблокирован]

Откуда:
Сообщений: 93
Aleksey br
Всем привет.
Можете подсказать как написать запрос к следующему интересному заданию:
Есть диамическая по полям таблица, которая раз в день пересобирается:
col1...col N-1col N
1...11
2...21
............
2...33

мне нужно все значения полей этой таблицы собирать в одно:
colcol Nane
1col1
2col1
...col1
2col1
......
1col N-1
2col N-1
...col N-1
3col N-1
1col N
1col N
...col N
3col N

в принципе, [col Name] можно не передавать.
Спасибо


Что это такое?

На момент выполнения запроса любая таблица - статическая.
8 дек 17, 13:03    [21017942]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "горизонтально-вертикальный" запрос?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
диамическая по полям таблица

Кул стори, удачи Вам с г-но архитектурой.
8 дек 17, 13:31    [21018037]     Ответить | Цитировать Сообщить модератору
 Re: Как написать "горизонтально-вертикальный" запрос?  [new]
xml же !
Guest
declare @t table (col1 int, col2 int, col3 int, col4 int, col5 int)

declare @i int=1

while @i<10
begin
	insert into @t select @i,@i,@i,@i,@i
	set @i=@i+1
end

--
declare @xml xml=(select * from @t for xml raw, elements)

select 
	col_name	=t.c.value('local-name(.)', 'varchar(20)')
	,col_value	=t.c.value('./text()[1]', 'int') 
from @xml.nodes('/row/*') as t(c)
order by 1

col_namecol_value
col11
col12
col13
col14
col15
col16
col17
col18
col19
col29
col28
col27
col26
col25
col24
col23
col22
col21
col31
col32
col33
col34
col35
col36
col37
col38
col39
col49
col48
col47
col46
col45
col44
col43
col42
col41
col51
col52
col53
col54
col55
col56
col57
col58
col59
8 дек 17, 16:09    [21018814]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить