首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SQL中转置查询结果?

问如何在SQL中转置查询结果?
EN

Stack Overflow用户
提问于 2019-07-04 02:44:01
回答 3查看 228关注 0票数 0

作为许多子查询的结果,我有下表:

代码语言:javascript
复制
+---------------------------------------------+
| register | simulation | hasLimit | approved |
+---------------------------------------------+
|     X    |     Y      |    Z     |    W     |
+---------------------------------------------+

但我希望它是这样的:

代码语言:javascript
复制
+----------------+
| register   | X | 
+----------------+
| simulation | Y | 
+----------------+
| hasLimit   | Z | 
+----------------+
| approved   | W | 
+----------------+

在R中,我会简单地使用t()函数进行转置,但是在SQL中,这似乎有点困难。我试着理解在这种情况下要应用的函数pivot,但这似乎有点奇怪,因为我实际上只是转置,而不是旋转任何东西。

EN

回答 3

Stack Overflow用户

发布于 2019-07-04 02:52:53

您似乎想要一个“取消轴心”操作。

假设列的类型都是兼容的,您可以使用union all

代码语言:javascript
复制
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。

这是一个非常小的数据量。对于较大的数据,我更喜欢横向连接,但是语法(以及其可用性)取决于数据库。

票数 0
EN

Stack Overflow用户

发布于 2019-07-04 03:00:19

给出了从

代码语言:javascript
复制
         SELECT 'x' AS register
              , 'y' AS simulation
              , 'z' AS hasLimit
              , 'w' AS approved

我们可以将其封装在一组括号中,并将其作为外部查询中的内联视图进行引用。

例如:

代码语言:javascript
复制
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集运算符组合在一起

代码语言:javascript
复制
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“按顺序”返回行,但不能保证这种行为。)

票数 0
EN

Stack Overflow用户

发布于 2019-07-04 11:23:42

使用如下所示的简单UNPIVOT:

代码语言:javascript
复制
SELECT Col, Val
FROM <Your Table>
UNPIVOT (Val FOR Col IN([register],[simulation],[hasLimit],[approved])) unpiv
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56876258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档