Как я могу использовать 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
Другие вопросы по тегам