2016-04-26 6 views
1

У меня есть простая таблица:Как выбрать данные из одной строки в sql как таблицу?

| Val1 | Val2 | 
-------------------------- 
| 10  |  20  | 
-------------------------- 
| 20  |  30  | 
-------------------------- 

Как выбрать данные из одной строки в этом и получить результат в виде таблицы, где данные в первом столбце будут столбец имени из исходной таблицы и данных во втором столбце будут данными из строки ? Как это:

| Name | value | 
---------------- 
| val1 | 10 | 
---------------- 
| val2 | 20 | 
+2

Используйте оператор 'UNPIVOT' –

ответ

3

Этот SQL Script создает временную таблицу, вставить некоторые значения и UNPIVOT результата.

CREATE TABLE #B 
    (VAL1 INT, VAL2 INT) 

INSERT INTO #B VALUES(10,20),(20,30) 

SELECT * FROM #B 

SELECT U.NAME, U.VALUE 
FROM (SELECT * FROM #B WHERE VAL1 = 10) AS SEL 
UNPIVOT 
(
    VALUE 
    FOR NAME IN (VAL1, VAL2) 
) U; 

DROP TABLE #B 

Вы явно не предписывают, каким образом «выбирать данные из одной строки в этом», поэтому я добавил образец ИНЕКЕ в суб выбора.

+0

можете попробовать у вас - Artemii – Chanukya

+0

Спасибо! Это то, что я имел в виду – Artemii

0

И еще альтернативное решение - используя CROSS APPLY

DECLARE @temp table ([val1] int, [val2] int); 

INSERT @temp (val1, val2) 
VALUES (10, 20), 
     (20, 30); 


SELECT x.Name, x.Value FROM @temp 
CROSS APPLY (
    VALUES ('Val1', val1), 
      ('Val2', val2) 
) x(Name, Value) 

Результат

Name Value 
------------- 
Val1 10 
Val2 20 
Val1 20 
Val2 30 
0

Рассмотрим такой сценарий:

Таблица 1:

DEPARTMENT EMPID ENAME SALARY 
A/C  1 TEST1 2000 
SALES 2 TEST2 3000 

Таблица 2:

ColumnName 1 2 
DEPARTMENT A/C  SALES 
EMPID 1 2 
ENAME TEST1 TEST2 
SALARY 2000 3000 

Если требуется, чтобы преобразовать результирующий набор в формате Table1 в формат Table2:

Как отображать динамически горизонтальные строки по вертикали:

Для отображения динамически горизонтальных строк по вертикали, Я использовал технику динамического разворачивания (используя метод Xquery и nodes())

, а затем динамический поворот.

Ниже блок кода преобразует результат в формате Table1 в формат Table2.

DECLARE @EMPLOYEE TABLE (DEPARTMENT VARCHAR(20),EMPID INT,ENAME VARCHAR(20),SALARY INT) 
INSERT @EMPLOYEE SELECT 'A/C',01,'TEST1',2000 
INSERT @EMPLOYEE SELECT 'SALES',02,'TEST2',3000 

SELECT * FROM @EMPLOYEE 

DECLARE @Xmldata XML = (SELECT * FROM @EMPLOYEE FOR XML PATH('')) 

--Dynamic unpivoting 
SELECT * INTO ##temp FROM (
SELECT 
ROW_NUMBER()OVER(PARTITION BY ColumnName ORDER BY ColumnValue) rn,* FROM (
SELECT i.value('local-name(.)','varchar(100)') ColumnName, 
     i.value('.','varchar(100)') ColumnValue 
FROM @xmldata.nodes('//*[text()]') x(i)) tmp) tmp1 
--SELECT * FROM ##temp 

--Dynamic pivoting 
DECLARE @Columns NVARCHAR(MAX),@query NVARCHAR(MAX) 
SELECT @Columns = STUFF(
(SELECT ', ' +QUOTENAME(CONVERT(VARCHAR,rn)) FROM 
(SELECT DISTINCT rn FROM ##temp) AS T FOR XML PATH('')),1,2,'') 
SET @query = N' 
SELECT ColumnName,' + @Columns + ' 
FROM 
(
    SELECT * FROM ##temp 
) i 
PIVOT 
(
    MAX(ColumnValue) FOR rn IN (' 
    + @Columns 
    + ') 
) j ;'; 

EXEC (@query) 
--PRINT @query 
DROP TABLE ##temp 

Я надеюсь, что это помогло вам понять вашу проблему.

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