Я хочу, чтобы результаты моего запроса выбора MS SQL 2008 отображались очень уникальным образом, и я надеюсь, что кто-нибудь сможет мне помочь.
Вместо того, чтобы отображать результаты для 3 столбцов в 9 строках, я хотел бы, чтобы данные отображались в одной строке и чтобы имена 3 столбцов повторялись 9 раз.
Я пробовал погуглить, но нигде не могу найти нужные идеи.
Спасибо всем, кто может помочь!
Я хотел опубликовать фото, но мне нужны репутации, чтобы сделать это, что так глупо! но в любом случае я нашел похожий пост, на который был дан ответ для PostgreSQL 8.3. но я новичок, поэтому не понимаю, как переводить это для MS SQL.
Перед:
col1 | col2 | col3 |
-----|--------|---------|
a |12/01/12| 13/01/12|
-----|--------|---------|
b |14/01/12| 14/01/12|
После:
col1 | col2 | col3 |col1 | col2 | col3 |
-----|--------|---------|-----|--------|---------|
a |12/01/12| 13/01/12| b |14/01/12| 15/01/12|
-----|--------|---------|-----|--------|---------|
Вот ссылка, чтобы дать вам лучшее представление о моей ситуации Преобразование нескольких строк в одну строку с несколькими столбцами
1 ответ
В SQL Server 2005+ вы можете использовать PIVOT
для этого. Сводная диаграмма берет ваши значения из строк и преобразует их в столбцы.
Есть несколько способов изменить данные. Если вы знаете все значения заранее, вы можете жестко запрограммировать запрос. В противном случае вы можете использовать динамический SQL для генерации запроса во время выполнения.
Статическая версия pivot будет похожа на это:
select *
from
(
select col1, col2
from table1
) src
pivot
(
max(col1)
for col2 in (test, blah, value)
) piv
См. SQL Fiddle с демонстрацией.
Если у вас есть неизвестное количество значений, вы должны сгенерировать динамический SQL, подобный этому:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(col2)
from table1
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT ' + @cols + ' from
(
select col1, col2
from table1
) x
pivot
(
max(col1)
for col2 in (' + @cols + ')
) p '
execute(@query)
См. SQL Fiddle с демонстрацией
Они берут значения строк col2
из вашей таблицы и превращают их в столбцы. Результат для обоих одинаковый:
| TEST | BLAH | VALUE |
-----------------------
| 1 | 2 | 3 |
До SQL Server 2005 или в базах данных, не имеющих функции pivot , вы должны использовать агрегатную функцию с выражением case
для преобразования данных:
select
max(case when col2 = 'test' then col1 end) test,
max(case when col2 = 'blah' then col1 end) blah,
max(case when col2 = 'value' then col1 end) value
from table1
См. SQL Fiddle с демонстрацией
Еще один способ сделать это, если вы хотите повторять столбцы снова и снова, - использовать функции UNPIVOT
и PIVOT
вместе для получения результата. Если у вас есть образцы данных:
CREATE TABLE yourtable
([id] int, [name] varchar(10), [type] varchar(10))
;
INSERT INTO yourtable
([id], [name], [type])
VALUES
(1, 'John', 'dog'),
(2, 'Tim', 'bird'),
(3, 'Betty', 'cat'),
(4, 'Jim', 'rat')
;
И вы хотите повторить значения id
, name
и type
в повторяющихся столбцах, тогда вы можете использовать:
select *
from
(
select
col +'_'+cast(rn as varchar(50)) col ,
value
from
(
select
cast(id as varchar(10)) id,
name,
type,
row_number() over(order by id) rn
from yourtable
) src
unpivot
(
value
for col in (id, name, type)
) unpiv
) src
pivot
(
max(value)
for col in (id_1, name_1, type_1,
id_2, name_2, type_2,
id_3, name_3, type_3,
id_4, name_4, type_4)
) piv
См. SQL Fiddle с демонстрацией. Результатом этого будет:
| ID_1 | NAME_1 | TYPE_1 | ID_2 | NAME_2 | TYPE_2 | ID_3 | NAME_3 | TYPE_3 | ID_4 | NAME_4 | TYPE_4 |
-----------------------------------------------------------------------------------------------------
| 1 | John | dog | 2 | Tim | bird | 3 | Betty | cat | 4 | Jim | rat |
Отредактируйте # 2, увидев ваши образцы данных, вы можете использовать следующее:
select *
from
(
select
col +'_'+cast(rn as varchar(50)) col ,
value
from
(
select
col1,
convert(varchar(10), col2, 120) col2,
convert(varchar(10), col3, 120) col3,
row_number() over(order by col1) rn
from yourtable
) src
unpivot
(
value
for col in (col1, col2, col3)
) unpiv
) src
pivot
(
max(value)
for col in (col1_1, col2_1, col3_1,
col1_2, col2_2, col3_2)
) piv
См. SQL Fiddle с демонстрацией
Дает результат:
| COL1_1 | COL2_1 | COL3_1 | COL1_2 | COL2_2 | COL3_2 |
-----------------------------------------------------------------------
| a | 2012-01-12 | 2012-01-13 | b | 2012-01-14 | 2012-01-14 |
unpivot
и pivot
, вы можете использовать выражение case
- sqlfiddle.com / #! 3 / 74e0a / 11
Похожие вопросы
Связанные вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.