作为许多子查询的结果,我有下表:
+---------------------------------------------+
| register | simulation | hasLimit | approved |
+---------------------------------------------+
| X | Y | Z | W |
+---------------------------------------------+但我希望它是这样的:
+----------------+
| register | X |
+----------------+
| simulation | Y |
+----------------+
| hasLimit | Z |
+----------------+
| approved | W |
+----------------+在R中,我会简单地使用t()函数进行转置,但是在SQL中,这似乎有点困难。我试着理解在这种情况下要应用的函数pivot,但这似乎有点奇怪,因为我实际上只是转置,而不是旋转任何东西。
发布于 2019-07-04 02:52:53
您似乎想要一个“取消轴心”操作。
假设列的类型都是兼容的,您可以使用union all
select 'register' as which, register as value union all
select 'simulation', simulation union all
select 'hasLimit', hasLimit union all
select 'approved', approved;有些数据库要求每个子查询都有一个FROM子句,例如from dual。
这是一个非常小的数据量。对于较大的数据,我更喜欢横向连接,但是语法(以及其可用性)取决于数据库。
发布于 2019-07-04 03:00:19
给出了从
SELECT 'x' AS register
, 'y' AS simulation
, 'z' AS hasLimit
, 'w' AS approved我们可以将其封装在一组括号中,并将其作为外部查询中的内联视图进行引用。
例如:
SELECT CASE i.n
WHEN 1 THEN 'register'
WHEN 2 THEN 'simulation'
WHEN 3 THEN 'hasLimit'
WHEN 4 THEN 'approved'
END AS col1
, CASE i.n
WHEN 1 THEN q.register
WHEN 2 THEN q.simulation
WHEN 3 THEN q.hasLimit
WHEN 4 THEN q.approved
END AS col2
FROM (
SELECT 'x' AS register
, 'y' AS simulation
, 'z' AS hasLimit
, 'w' AS approved
) q
CROSS
JOIN ( SELECT 1 AS n
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
) i
ORDER
BY i.n这看起来有点繁琐,假设您已经有返回标量值的子查询,我们可以将它们与UNION ALL集运算符组合在一起
SELECT 'register' AS col1, ( scalar_subquery_for_x ) AS col2
UNION ALL
SELECT 'simulation' , ( scalar_subquery_for_y )
UNION ALL
SELECT 'hasLimit' , ( scalar_subquery_for_z )
UNION ALL
SELECT 'approved' , ( scalar_subquery_for_w )如果我们需要一个有保证的订单,我们可以用括号把整个东西包起来,然后添加一个order BY子句。(如果没有ORDER BY,我们会观察到从UNION ALL“按顺序”返回行,但不能保证这种行为。)
发布于 2019-07-04 11:23:42
使用如下所示的简单UNPIVOT:
SELECT Col, Val
FROM <Your Table>
UNPIVOT (Val FOR Col IN([register],[simulation],[hasLimit],[approved])) unpivhttps://stackoverflow.com/questions/56876258
复制相似问题