Я хочу, чтобы результаты моего запроса выбора 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|
-----|--------|---------|-----|--------|---------|

Вот ссылка, чтобы дать вам лучшее представление о моей ситуации Преобразование нескольких строк в одну строку с несколькими столбцами

0
Travis Stanley 25 Янв 2013 в 17:52
1
T-SQL поддерживает PIVOT; stackoverflow.com/questions/9830960 /… - Если это не то, что вам нужно, это может помочь предоставить пример до и после вашего желаемого вывода.
 – 
Alex K.
25 Янв 2013 в 17:56
Если вы отредактируете свой пост, указав структуру таблицы, образцы данных, а затем желаемый результат, я мог бы изменить свой ответ, чтобы он был более конкретным для ваших нужд.
 – 
Taryn
25 Янв 2013 в 18:10
Я не могу публиковать картинки из-за моей репутации
 – 
Travis Stanley
25 Янв 2013 в 18:21
Ok. Однако я не просил вас публиковать какие-либо фотографии.
 – 
Lamak
25 Янв 2013 в 18:27
1
Я хотел продемонстрировать то, что хотел знать. Я отредактировал свой пост, чтобы проиллюстрировать свой вопрос.
 – 
Travis Stanley
25 Янв 2013 в 18:29

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 |
3
Taryn 25 Янв 2013 в 18:36
Я добавил версию, более конкретную для ваших образцов данных.
 – 
Taryn
25 Янв 2013 в 18:36
Если вы не хотите использовать unpivot и pivot, вы можете использовать выражение case - sqlfiddle.com / #! 3 / 74e0a / 11
 – 
Taryn
25 Янв 2013 в 18:40
1
+1. Иногда мне кажется, что ты заслуживаешь медали. Ну, значки - это последняя вещь на SO
 – 
Lamak
25 Янв 2013 в 18:43
Большое спасибо за помощь, я очень ценю это, он работает :) Сделал мои выходные :)
 – 
Travis Stanley
25 Янв 2013 в 18:45
Рад был помочь!! :)
 – 
Taryn
25 Янв 2013 в 18:46