简体   繁体   English

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

[英]How to select data from one row in sql as table?

I have simple table: 我有简单的表:

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

How to select data from one row in this and get result as table where data in first column will be column name from original table and data in second column will be data from row? 如何从中选择一行中的数据并获得结果作为表,其中第一列中的数据将是原始表中的列名,第二列中的数据将是来自行的数据? Like this: 像这样:

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

This SQL Script will create a temporary table, insert some values and unpivot the result. 此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

You did not explicitly prescribe how to "select data from one row in this", so I added a sample WHERE clause in a sub select. 您没有明确规定如何“从中选择一行中的数据”,因此我在子选择中添加了一个示例WHERE子句。

And another alternate solution is - using CROSS APPLY 另一个替代解决方案是 - 使用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)

Result 结果

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

Consider this scenario : 考虑这种情况:

Table 1: 表格1:

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

Table 2: 表2:

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

If we are required to transform result set in Table1 format to Table2 format: 如果我们需要将Table1格式的结果集转换为Table2格式:

How to display dynamically horizontal rows vertically: 如何垂直显示动态水平行:

To display dynamically horizontal rows vertically, I have used the technique of dynamic unpivoting (using Xquery and nodes() method ) 为了垂直显示动态水平行,我使用了动态unpivoting技术(使用Xquery和nodes()方法)

and then dynamic pivoting . 然后动态旋转。

Below code block will transform result set in Table1 format to Table2 format. 下面的代码块将表1格式的结果集转换为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

I hope this has helped you understand your problem. 我希望这有助于您了解您的问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM