#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 столбцов.