2012-03-28 2 views
0

У меня есть строка данных со столбцами A, B, C, D, E, F ... Как можно написать SQL SELECT, чтобы получить результат:SQL строк в столбцах 2

Col1, Col2 
A, B 
C, D 
E, F 
... 

EDIT : Будет только одна строка и динамическое число столбцов. И мне не разрешено использовать таблицы information_schema и sys. Также было бы интересно узнать, как это сделать для всей таблицы (несколько строк A, B, C, D, E ..), а не единственная строка.

+0

Хотите ли вы решение как для Oracle и Sql Server? –

+0

Вам нужно иметь SQL-решение? – mellamokb

+0

Адриан, это не имеет значения, мне просто нужно одно решение. – Lukas

ответ

5

Если вы знаете, список столбцов раньше время, она должна быть столь же просто, как unioning каждой группы из двух колонн вместе:

;with Data as (
    select 'A' as A, 'B' as B, 'C' as C, 'D' as D, 'E' as E, 'F' as F 
) 
select A,B from Data union 
select C,D from Data union 
select E,F from Data 

Если список столбцов является динамическим, вы будете нуждаться в динамическом SQL для обработать. Вот полностью рабочий пример с использованием тестовой таблицы с 11 столбцами:

create table Test (id01 int,id02 int,id03 int,id04 int,id05 int,id06 int,id07 int,id08 int,id09 int,id10 int,id11 int); 
insert Test values (1,2,3,4,5,6,7,8,9,10,11); 

declare @select varchar(max) 
;with ColumnInfo as (
    select 
     row_number() over (order by column_name) - 1 as rownumber, 
     column_name 
    from information_schema.columns 
    where table_name = 'Test' 
) 
select 
    @select = coalesce(@select + ' union ' + char(13) + char(10), '') + 
     'select ' + max(case when rownumber % 2 = 0 then column_name end) + 
     ',' + coalesce(max(case when rownumber % 2 = 1 then column_name end), 'NULL') + 
     ' from test' 
from 
    ColumnInfo 
group by 
    rownumber/2 

exec(@select) 

Пример ввода:

id01 id02 id03 id04 id05 id06 id07 id08 id09 id10 id11 
1 2 3 4 5 6 7 8 9 10 11 

Пример вывода:

id01 id02 
1 2 
3 4 
5 6 
7 8 
9 10 
11 NULL 

Живая демонстрация: http://sqlfiddle.com/#!3/d0507/1

1

С MS SQL вы можете использовать этот трюк:

DECLARE @s VARCHAR(max) 

SET @s='' 

SELECT @[email protected]+','+val FROM (
SELECT Col1 AS [val] FROM [your table] 
UNION ALL 
SELECT Col2 FROM [your table]) as [data] 
ORDER BY [val] 
SELECT @s 

С PostgreSQL:

SELECT string_agg("val",',') FROM (
SELECT Col1 AS "val" FROM "your table" 
UNION ALL 
SELECT Col2 FROM "your table" 
ORDER BY 1) AS "data" 

MySQL:

SELECT GROUP_CONCAT(`val`,',') FROM (
SELECT Col1 AS `val` FROM `your table` 
UNION ALL 
SELECT Col2 FROM `your table` 
ORDER BY 1) AS `data`; 
1

Если вы хотите, имена столбцов отображаются (и не UNPIVOT данные одной строки), вы можете использовать information_schema:

SELECT a.column_name AS col1 
    , b.column_name AS col2 
FROM 
    information_schema.columns AS a 
    LEFT JOIN 
    information_schema.columns AS b 
     ON b.table_schema = 'database_name' 
     AND b.table_name = 'table_name' 
     AND b.ordinal_position = a.ordinal_position + 1 
WHERE a.table_schema = 'database_name' 
    AND a.table_name = 'table_name' 
    AND a.ordinal_position % 2 = 1 ; 
+0

Возможно, это сработает, но мне не разрешено использовать information_schema. – Lukas

+0

Вам запрещено использовать 'information_schema'? Как еще вы ожидаете получить список столбцов в таблице? – mellamokb

+0

Нет, после вашего редактирования, нет. Это не будет делать то, что вы хотите. Это будет показывать имена столбцов, а не данные одной строки. –

4

используя невольник, вы могли бы это сделать. See it working

WITH piv1 
    AS (SELECT foo, 
       bar, 
       Row_number() OVER (ORDER BY bar) rn 
     FROM test p 
       UNPIVOT (foo FOR bar IN (col1, col2, col3, col4, col5, col6)) 
       AS unpvt) 
SELECT t1.foo col1, 
     t2.foo col2 
FROM piv1 t1 
     INNER JOIN piv1 t2 
     ON t1.rn = t2.rn - 1 
WHERE t1.rn % 2 = 1 

Если вы хотите, чтобы сделать его динамичным вам просто нужно, чтобы сделать эту часть динамической

UNPIVOT (foo FOR bar IN (col1, col2, col3, col4, col5, col6))

+0

Whoa, sqlfiddle.com - это круто, спасибо за обмен! – mellamokb

+1

@mellamokb да, это потрясающе. соавтор SOer [Джейк Фейсел] (http://stackoverflow.com/users/808921/jake-feasel) построил его –

Смежные вопросы