是否可以将 1 个选定的行列恰好转置为行
Is it possible to transpose exactly 1 selected row columns into rows
如标题所说,是否可以将表格中选定的一行恰好转置为列?我正在使用 Oracle 数据库。例如我有一个有点复杂的查询:
SELECT t1.id,
t1.data1,
t1.data2,
t2.data1,
t2.data2,
t2.data3,
subs1.data1,
subs2.data1,
subs2.data2
FROM Table1 t1
JOIN Table2 t2
ON t1.id = t2.id
JOIN
(SELECT st1.id,
st1.data1
FROM subTable1 st1
JOIN subTable2
ON st1.id = st2.id
WHERE st2.data1 > 1
) AS subs1 ON subs.id = t2.id
LEFT JOIN
(SELECT st3.id,
st4.data1,
st4.data2
FROM subTable3 st3
JOIN subTable4 st4
ON st3.id = st4.id
UNION
SELECT st4.id, st4.data1, st4.data2 FROM subTable4 st4 WHERE st4.data1 = 1
) AS subs2.id = t1.id
WHERE t1.id = 1
查询结果应如下所示,并且始终恰好是一行:
+--------+-------------+-------------+-------------+-------------+-------------+----------------+----------------+----------------+
| t1.id | t1.data1 | t1.data2 | t2data1 | t2.data2 | t2.data3 | subs1.data1 | subs2.data1 | subs2.data2 |
+--------+-------------+-------------+-------------+-------------+-------------+----------------+----------------+----------------+
| someId | someT1Data1 | someT1Data2 | someT2Data1 | someT2Data2 | someT2Data3 | someSubs1Data1 | someSubs2Data1 | someSubs2Data2 |
+--------+-------------+-------------+-------------+-------------+-------------+----------------+----------------+----------------+
我愿意达到的目标应该是这样的:
+-------------+----------------+
| col1 | col2 |
+-------------+----------------+
| t1.id | someId |
| t1.data1 | someT1Data1 |
| t1.data2 | someT1Data2 |
| t2data1 | someT2Data1 |
| t2.data2 | someT2Data2 |
| t2.data3 | someT2Data3 |
| subs1.data1 | someSubs1Data1 |
| subs2.data1 | someSubs2Data1 |
| subs2.data2 | someSubs2Data2 |
+-------------+----------------+
注意:输出中不需要 col1
所以问题是:
是否有一些简单的解决方法可以将表格中的一个选定行恰好转置为列?我的意思是比使用 PIVOT() 函数更简单的方法,或者如果没有其他选择,如何在有点复杂的查询(嵌套查询等)上使用 PIVOT()?
提前谢谢你。
Pivot
是完成这项工作的工具,但您也可以通过将查询放在 CTE
中然后使用多个 union all
分别获取列来获得相同的结果:
with cte as (
/* your query, with appropriate aliases for columns with same name*/
)
select 't1.id' as col1, cte.id as col2 from cte union all
select 't1.data1', cte.data1 from cte union all
...
select 'subs2.data2', cte.subsdata2 from cte
在这种情况下,Pivot 将是更好的选择。获得第一部分结果后,只需使用此查询即可。
SELECT col1, col2 from @Table
Unpivot
(Col2 For Col1 IN
(t1.id,t1.data1,t1.data2,t2.data1,t2.data2,t2.data3,subs1.data1,subs2.data1,subs2.data2)) AS a
如果您遇到任何困难,请告诉我。
如标题所说,是否可以将表格中选定的一行恰好转置为列?我正在使用 Oracle 数据库。例如我有一个有点复杂的查询:
SELECT t1.id,
t1.data1,
t1.data2,
t2.data1,
t2.data2,
t2.data3,
subs1.data1,
subs2.data1,
subs2.data2
FROM Table1 t1
JOIN Table2 t2
ON t1.id = t2.id
JOIN
(SELECT st1.id,
st1.data1
FROM subTable1 st1
JOIN subTable2
ON st1.id = st2.id
WHERE st2.data1 > 1
) AS subs1 ON subs.id = t2.id
LEFT JOIN
(SELECT st3.id,
st4.data1,
st4.data2
FROM subTable3 st3
JOIN subTable4 st4
ON st3.id = st4.id
UNION
SELECT st4.id, st4.data1, st4.data2 FROM subTable4 st4 WHERE st4.data1 = 1
) AS subs2.id = t1.id
WHERE t1.id = 1
查询结果应如下所示,并且始终恰好是一行:
+--------+-------------+-------------+-------------+-------------+-------------+----------------+----------------+----------------+
| t1.id | t1.data1 | t1.data2 | t2data1 | t2.data2 | t2.data3 | subs1.data1 | subs2.data1 | subs2.data2 |
+--------+-------------+-------------+-------------+-------------+-------------+----------------+----------------+----------------+
| someId | someT1Data1 | someT1Data2 | someT2Data1 | someT2Data2 | someT2Data3 | someSubs1Data1 | someSubs2Data1 | someSubs2Data2 |
+--------+-------------+-------------+-------------+-------------+-------------+----------------+----------------+----------------+
我愿意达到的目标应该是这样的:
+-------------+----------------+
| col1 | col2 |
+-------------+----------------+
| t1.id | someId |
| t1.data1 | someT1Data1 |
| t1.data2 | someT1Data2 |
| t2data1 | someT2Data1 |
| t2.data2 | someT2Data2 |
| t2.data3 | someT2Data3 |
| subs1.data1 | someSubs1Data1 |
| subs2.data1 | someSubs2Data1 |
| subs2.data2 | someSubs2Data2 |
+-------------+----------------+
注意:输出中不需要 col1
所以问题是: 是否有一些简单的解决方法可以将表格中的一个选定行恰好转置为列?我的意思是比使用 PIVOT() 函数更简单的方法,或者如果没有其他选择,如何在有点复杂的查询(嵌套查询等)上使用 PIVOT()?
提前谢谢你。
Pivot
是完成这项工作的工具,但您也可以通过将查询放在 CTE
中然后使用多个 union all
分别获取列来获得相同的结果:
with cte as (
/* your query, with appropriate aliases for columns with same name*/
)
select 't1.id' as col1, cte.id as col2 from cte union all
select 't1.data1', cte.data1 from cte union all
...
select 'subs2.data2', cte.subsdata2 from cte
Pivot 将是更好的选择。获得第一部分结果后,只需使用此查询即可。
SELECT col1, col2 from @Table
Unpivot
(Col2 For Col1 IN
(t1.id,t1.data1,t1.data2,t2.data1,t2.data2,t2.data3,subs1.data1,subs2.data1,subs2.data2)) AS a
如果您遇到任何困难,请告诉我。