СВОДНЫЙ SQL только в одном столбце

#sql #sql-server #pivot

#sql #sql-server #сводный

Вопрос:

Итак, у меня есть эта «таблица», которая является результатом запроса

 SELECT  Valoare 
FROM GEConfig 
WHERE  Cimp IN('Societate','Adresa','Banca','CapitalSocial','Cont','CUI','NrRegCom','ModulReceptiiExtCotaTVA')
  

GeConfig — это таблица, которая используется для настройки приложения для каждого клиента, поэтому данные, которые будут получены в результате приведенного выше запроса, будут разными для каждого клиента.

     Valoare
========================
1   aaa
2   bbb
3   ccc
4   ddd
5   eee
6   fff
7   ggg
8   hhh
  

Я хочу свернуть эту таблицу так, чтобы она выглядела как

   col1  col2  col3  col4  col5  col6  col7  col8
   aaa   bbb   ccc   ddd   eee   fff   ggg   hhh
  

У меня нет никакого агрегата, у меня есть только один столбец с 8 строками, который я хочу превратить в 1 строку с 8 столбцами.

Зачем мне это нужно? Я должен использовать отчет into Rave. Я пробовал что-то вроде этого

 select Valoare
  , [1] 
  , [2]
  , [3]
from
(
  select   Valoare from GEConfig 
) x
pivot
(
  max(Valoare)
  for Valoare in([1], [2], [3])
)p
  

Но ясно, что это очень, очень неправильно, поскольку я понятия не имею, как использовать сводную таблицу.

Комментарии:

1. Число в таблице — это идентификатор или просто номер строки?

2. Номер строки, у меня есть только тот столбец, который имеет отношение к этому сценарию.

Ответ №1:

Более общий подход заключается в добавлении номера строки и использовании его в качестве привязки

 WITH _ID AS (
  SELECT Valoare
       , _ID = Row_Number() OVER (ORDER BY Valoare)
  FROM   GEConfig
)
SELECT [1] = MAX(CASE WHEN _ID = 1 THEN Valoare ELSE NULL END)
     , [2] = MAX(CASE WHEN _ID = 2 THEN Valoare ELSE NULL END)
     , [3] = MAX(CASE WHEN _ID = 3 THEN Valoare ELSE NULL END)
     , [4] = MAX(CASE WHEN _ID = 4 THEN Valoare ELSE NULL END)
     , [5] = MAX(CASE WHEN _ID = 5 THEN Valoare ELSE NULL END)
     , [6] = MAX(CASE WHEN _ID = 6 THEN Valoare ELSE NULL END)
     , [7] = MAX(CASE WHEN _ID = 7 THEN Valoare ELSE NULL END)
     , [8] = MAX(CASE WHEN _ID = 8 THEN Valoare ELSE NULL END)
FROM   _ID
  

Статический случай

Вы можете использовать настоящий, PIVOT как в ответе от MarkD, или вы можете использовать поддельный

 SELECT [1] = MAX(CASE WHEN Valoare = 'aaa' THEN 'aaa' ELSE NULL END)
     , [2] = MAX(CASE WHEN Valoare = 'bbb' THEN 'bbb' ELSE NULL END)
     , [3] = MAX(CASE WHEN Valoare = 'ccc' THEN 'ccc' ELSE NULL END)
     , [4] = MAX(CASE WHEN Valoare = 'ccc' THEN 'ccc' ELSE NULL END)
     , [5] = MAX(CASE WHEN Valoare = 'ddd' THEN 'ddd' ELSE NULL END)
     , [6] = MAX(CASE WHEN Valoare = 'eee' THEN 'eee' ELSE NULL END)
     , [7] = MAX(CASE WHEN Valoare = 'fff' THEN 'fff' ELSE NULL END)
     , [8] = MAX(CASE WHEN Valoare = 'ggg' THEN 'ggg' ELSE NULL END)
FROM   GEConfig
  

Комментарии:

1. Тот же ответ, что и для Mark, я не всегда знаю значение Valoare поля… Я генерирую это значение с помощью этого запроса select Valoare из GEConfig, где Cimp в (‘Societate’, ‘Adresa’, ‘Banca’, ‘CapitalSocial’, ‘Cont’, ‘CUI’, ‘NrRegCom’, ‘MODULRECEPTIIIEXT Catatva’)

Ответ №2:

Попробуйте это:

 SELECT * from
  (SELECT cast([name] AS nvarchar(MAX)) [name], row_number() over(
                                                                  ORDER BY name) AS id
   FROM TEMP)a pivot ( max([name])
                      FOR id IN ([1], [2], [3], [4], [5]) )pvt
  

Ответ №3:

Вы можете выполнить это с помощью COALESCE :

 declare @val varchar(max)

select @val = coalesce(@val, '')   ' '   Valoare from GEConfig

select @val
  

Комментарии:

1. Это создает только один столбец, я хочу 8 столбцов.