我有简单的表格:
| Val1 | Val2 |
--------------------------
| 10 | 20 |
--------------------------
| 20 | 30 |
--------------------------
如何从中选择一行中的数据并获取结果作为表,其中第一列中的数据将是原始表中的列名,第二列中的数据将是来自行的数据? 像这样:
| Name | value |
----------------
| val1 | 10 |
----------------
| val2 | 20 |
答案 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
我希望这有助于您了解您的问题。