Как я могу использовать SQL для преобразования строки в столбец?
Я провел исследование, и большинство вопросов касаются противоположной ситуации (столбцы в строки). Я хочу знать, как в среде MS-Access Query Design я могу преобразовать следующие примеры данных из состояния #1 в состояние #2.
State #1
Row | Organization | SatelliteLocation1 | SatelliteLocation2 | SatelliteLocation3
001 ABC 1000A 1000B
002 DEF 2000A 2000B
003 GHI 3000A 3000B
State #2
Row | Organization | SatelliteLocationValues
001 ABC 1000A
002 ABC 1000B
003 DEF 2000A
003 DEF 2000B
004 GHI 3000A
004 GHI 3000B
Пожалуйста, имейте в виду, что:
1) Да, в состоянии #1 для некоторых столбцов есть нулевые значения.
2) Я использую Access 2010.
3 ответа
То, что вы ищете, иногда называют "непивотным" запросом. Это СОЮЗ одного подзапроса для каждого столбца:
SELECT
Row,
Organization,
SatelliteLocation1 AS SatelliteLocations
FROM State1
WHERE SatelliteLocation1 IS NOT NULL
UNION ALL
SELECT
Row,
Organization,
SatelliteLocation2 AS SatelliteLocations
FROM State1
WHERE SatelliteLocation2 IS NOT NULL
UNION ALL
SELECT
Row,
Organization,
SatelliteLocation3 AS SatelliteLocations
FROM State1
WHERE SatelliteLocation3 IS NOT NULL
Напишите три разных запроса SQL, чтобы получить первые два столбца, и каждый запрос отличается SatelliteLocation
поле (с проверкой нулевой осведомленности) и UNION
три результата.
Cross Apply - хорошее решение здесь:
-- load test data
declare @YourTable table
(
Row char(3),
Organization char(3),
SatelliteLocation1 char(5),
SatelliteLocation2 char(5),
SatelliteLocation3 char(5)
)
insert into @YourTable
values
('001','ABC','1000A',NULL,'1000B'),
('002','DEF','2000A','2000B',NULL),
('003','GHI','3000A','3000B',NULL)
-- return State #2
select Row,Organization,SatelliteLocationValues
from @YourTable s
cross apply (
select SatelliteLocation1 as SatelliteLocationValues union
select SatelliteLocation2 union
select SatelliteLocation3
) t
where t.SatelliteLocationValues is not null
order by Row