sql-server - 将两列的值转换为列名
问题描述
我有一张如下表
RowNamesCol1 RowNamesCol2 Col1 Col2
Col1Row1 Col2Row1 1 4
Col1Row2 Col2Row2 2 5
Col1Row3 Col2Row3 3 6
我想出了以下查询:
SELECT * FROM (
SELECT * FROM (
SELECT RowNamesCol1, RowNamesCol2, colnames, colvalues FROM PivUnPiv1
UNPIVOT
(colvalues FOR colnames IN (col1, col2)) AS unpivtable) as a
PIVOT
(MAX(Colvalues) FOR RowNamesCol2 IN ([Col2Row1], [Col2Row2], [Col2Row3])) AS P
) AS b
PIVOT
(MAX(Colnames) FOR RowNamesCol1 IN ([Col1Row1], [Col1Row2], [Col1Row3])) AS P2
结果如下:
Col2Row1 | Col2Row2 |Col2Row3 |Col1Row1 |Col1Row2 |Col1Row3
-------------------------------------------------------------------
NULL | NULL |3 |NULL |NULL |Col1
NULL | NULL |6 |NULL |NULL |Col2
NULL | 2 |NULL |NULL |Col1 |NULL
NULL | 5 |NULL |NULL |Col2 |NULL
1 | NULL |NULL |Col1 |NULL |NULL
4 | NULL |NULL |Col2 |NULL |NULL
但我正在寻找如下:
________________________________________
| RNC1 | Col1Row1 | Col1Row2 | Col1Row3|
|---------------------------------------|
| RNC2 | Col2Row1 | Col2Row2 | Col2Row3|
|---------------------------------------|
| Col1 | 1 | 2 | 3 |
|---------------------------------------|
| Col2 | 4 | 5 | 6 |
|---------------------------------------|
您的帮助将不胜感激。
解决方案
通过旋转可以这样完成:
SELECT *
FROM
(SELECT ROW_NUMBER() over (ORDER BY (SELECT NULL)) as rn,
-- add row number w/o any strict sorting just to somehow
-- separate one row from another and to use in PIVOT part
RowNamesCol1, -- all columns should be same datatype
RowNamesCol2, -- I use varchar(50) as example
CAST(Col1 as varchar(50)) as Col1,
CAST(Col2 as varchar(50)) as Col2
FROM Test) AS SourceTable
UNPIVOT
([value] FOR [key] IN (RowNamesCol1, RowNamesCol2, Col1, Col2)
) AS unpvt
PIVOT -- you need as much numbers as rows in your table
(MAX ([value]) FOR rn IN ([1], [2], [3])
) AS pvt
输出:
| key | 1 | 2 | 3 |
|--------------|----------|----------|----------|
| Col1 | 1 | 2 | 3 |
| Col2 | 4 | 5 | 6 |
| RowNamesCol1 | Col1Row1 | Col1Row2 | Col1Row3 |
| RowNamesCol2 | Col2Row1 | Col2Row2 | Col2Row3 |
推荐阅读
- qt - QCharts 裁剪为矩形并使用水平滚动
- entity-framework - 在 asp.net core 3.0 中找不到 _CookieConsentPartial.cshtml
- laravel - Laravel:中间件检查用户是否被软删除
- excel - Microsoft Excel 最新更新(版本 1902 Build 11328.20512)破坏了 Querytables vba。代码在以前的版本中工作
- hibernate - JPA/Hibernate:合并 Composite Key 的属性创建另一行而不是更新现有的
- arrays - 尝试保留此原始数组在此处失败
- kotlin - kotlin中接口引用如何访问类方法和变量
- java - 如何打开现有的 android 应用程序并使用颤振向其发送数据
- postgresql - Postgres 在 Schema 中使用 Hstore 给出运算符不存在的错误
- maven - 在“更新 Maven 项目”期间发生内部错误。java.lang.ExceptionInInitializerError