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

如何从sql中的一行中选择数据作为表?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一张简单的桌子: | Val1 | Val2 | -------------------------- | 10 | 20 | -------------------------- | 20 | 30 | -------------------------- 如何从该表中的一行中选择数据并将结果作为表,其中第一列中的数据将是来自原始表的列名,第二列中的数据将是来自该行的数据? 像这样: | Name | va

我有一张简单的桌子:

|   Val1    |    Val2    |
--------------------------
|    10     |     20     |
--------------------------
|    20     |     30     |
--------------------------
如何从该表中的一行中选择数据并将结果作为表,其中第一列中的数据将是来自原始表的列名,第二列中的数据将是来自该行的数据? 像这样:

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

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

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子句。

另一个替代解决方案是-使用
交叉应用

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

考虑以下情况:

表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
如果我们需要将表1格式的结果集转换为表2格式:

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

为了垂直动态显示水平行,我使用了动态取消激活技术(使用Xquery和nodes()方法)

然后是动态旋转

下面的代码块将表1格式的结果集转换为表2格式

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

我希望这有助于你理解你的问题

使用
UNPIVOT
Operator您可以尝试此操作--Artemi谢谢!这就是我的意思