如何从sql中的一行中选择数据作为表?

时间:2016-04-26 11:14:26

标签: sql sql-server tsql

我有简单的表格:

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

如何从中选择一行中的数据并获取结果作为表,其中第一列中的数据将是原始表中的列名,第二列中的数据将是来自行的数据? 像这样:

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

3 个答案:

答案 0 :(得分:3)

此SQL脚本将创建一个临时表,插入一些值并取消结果。

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

你没有明确规定如何在这个"中从一行中选择数据,所以我在子选择中添加了一个示例WHERE子句。

答案 1 :(得分: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

答案 2 :(得分: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格式:

如何垂直显示动态水平行:

要垂直显示动态水平行,我使用了动态unpivoting技术(使用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

我希望这有助于您了解您的问题。