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

时间:2019-07-03 18:44:00

标签: sql transpose unpivot

由于许多子查询,我有下表:

+---------------------------------------------+
| register | simulation | hasLimit | approved |
+---------------------------------------------+
|     X    |     Y      |    Z     |    W     |
+---------------------------------------------+

但是我希望它像这样:

+----------------+
| register   | X | 
+----------------+
| simulation | Y | 
+----------------+
| hasLimit   | Z | 
+----------------+
| approved   | W | 
+----------------+

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

3 个答案:

答案 0 :(得分:0)

您似乎想要执行“取消枢纽”操作。

假设列的类型都兼容,则可以使用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

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

答案 1 :(得分:0)

给出

的回报
         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 )

如果我们需要有保证的顺序,则可以将整个内容包装在parens中并添加ORDER BY子句。 (在没有ORDER BY的情况下,我们确实观察到UNION ALL返回的行是“按顺序”的,但是不能保证此行为。)

答案 2 :(得分:0)

使用以下简单的UNPIVOT

SELECT Col, Val
FROM <Your Table>
UNPIVOT (Val FOR Col IN([register],[simulation],[hasLimit],[approved])) unpiv