SQL запрос на выборку данных в транспонированной форме - PullRequest
1 голос
/ 05 мая 2020

Я хочу получить данные из MS Access в Excel с помощью запроса SQL. Но я хочу, чтобы данные переносились и извлекались. В качестве примера:

База данных выглядит так:

Name age education city
David 24 MS New York

Я хочу, чтобы запрос имел следующий вид:

Name David
age 24
education MS
city New Yor

Если я напишу SELECT * from table;, он будет получать данные в том же порядке, что и в базе данных. Но я хочу, чтобы их переставили.

Ответы [ 2 ]

1 голос
/ 05 мая 2020
SELECT col
    ,colval
FROM (
    SELECT name
        ,age
        ,education
        ,city
    FROM MyTable
    ) p
UNPIVOT(ColVal FOR Col IN (
            name
            ,age
            ,education
            ,city
            )) AS unpvt
1 голос
/ 05 мая 2020

Простым переносимым решением является использование union all, однако для выравнивания типов данных может потребоваться дополнительное приведение (я бы предположил, что age имеет числовой c тип данных):

In MS Access:

select 'name' col, name val from mytable
union all select 'age', CStr(age) from mytable
union all select 'education', education from mytable
union all select 'city', city from mytable

В MySQL:

select 'name' col, name val from mytable
union all select 'age', cast(age as char(3)) from mytable
union all select 'education', education from mytable
union all select 'city', city from mytable

В SQL сервере это проще и эффективнее сделать с помощью cross apply:

select x.*
from mytable t
cross apply (values 
    ('name', name), 
    ('age', cast(age as varchar(3)),
    ('education', education),
    ('city', city)
) x(col, val)
...