如何从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谢谢!这就是我的意思