Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 转换查询输出_Sql_Oracle11g_Transpose - Fatal编程技术网

Sql 转换查询输出

Sql 转换查询输出,sql,oracle11g,transpose,Sql,Oracle11g,Transpose,我有一个正常的select查询,它会在输出之后产生结果 select cid,x1,x2,x3,x4,fy from temp_table; cid x1 x2 x3 x4 fy ---------------------------- 6657 100 0 0 200 2014 6658 300 0 0 400 2015 6659 500 0 0 600 2016 2014 2015 2016 ---

我有一个正常的select查询,它会在输出之后产生结果

select cid,x1,x2,x3,x4,fy
  from temp_table;

cid     x1  x2  x3  x4  fy
----------------------------
6657    100 0   0   200 2014
6658    300 0   0   400 2015
6659    500 0   0   600 2016
    2014    2015    2016    
-------------------------   
x1  100     300     500     
x2  0       0       0       
x3  0       0       0       
x4  200     400     600 
我想让它在输出后重写打印

select cid,x1,x2,x3,x4,fy
  from temp_table;

cid     x1  x2  x3  x4  fy
----------------------------
6657    100 0   0   200 2014
6658    300 0   0   400 2015
6659    500 0   0   600 2016
    2014    2015    2016    
-------------------------   
x1  100     300     500     
x2  0       0       0       
x3  0       0       0       
x4  200     400     600 

如何实现这一点?

这里有一种方法可以通过子查询和聚合实现这一点:

select name,
       sum(case when fy = 2014 then x end) as "2014",
       sum(case when fy = 2015 then x end) as "2015",
       sum(case when fy = 2016 then x end) as "2016"
from (select fy,
             (case when n.n = 1 then 'x1'
                   when n.n = 2 then 'x2'
                   when n.n = 3 then 'x3'
                   when n.n = 4 then 'x4'
              end) as name,
             (case when n.n = 1 then x1
                   when n.n = 2 then x2
                   when n.n = 3 then x3
                   when n.n = 4 then x4
              end) as x
      from temp_table cross join
            (select 1 as n from dual union all
             select 2 from dual union all
             select 3 from dual union all
             select 4 from dual
            ) n
     ) t
group by name;

您也可以使用
pivot
,但这是对Oracle SQL的最新添加,因此我倾向于使用此方法。

更通用的解决方案是使用此方法。
您的
temp_表
已经是一个透视表,其中(x1 x2 x3 x4)为x轴,fy为y轴
首先,我们需要将温度表解除锁定到解除锁定的温度表中,然后将fy轴作为x轴,将(x1 x2 x3 x4)轴作为y轴:

with unpivoted_temp_table as (

SELECT *
  FROM   temp_table
  UNPIVOT (
          totalSales                            
          FOR x                             
          IN  (x1, x2, x3, x4)
         )
)  

select *  
FROM   unpivoted_temp_table 
  PIVOT (
               SUM(totalSales)        
           FOR fy          
          IN (2014, 2015, 2016)
         )
order by 1 --order by column X

在Oracle 11G中有三种可能的转置选项

  • 解码选项

    • a。如果要转置,请对新列使用SUM和DECODE 总结

    • b。如果要转置,请对新列使用MAX和DECODE 不作总结

  • 使用枢轴

  • 如Gordon所述,与和子选择一起使用

若要使用pivot,则无法在代码中使用pivot,因为初始数据集已被透视

WITH TEMP1
    AS (SELECT
             6657 AS CID,
             100 AS VAL,
             'X1' AS XCORD,
             2014 AS FY
        FROM
             DUAL
        UNION ALL
        SELECT
             6657 AS CID,
             0 AS VAL,
             'X2' AS XCORD,
             2014 AS FY
        FROM
             DUAL
        UNION ALL
        SELECT
             6657 AS CID,
             0 AS VAL,
             'X3' AS XCORD,
             2014 AS FY
        FROM
             DUAL
        UNION ALL
        SELECT
             6657 AS CID,
             200 AS VAL,
             'X4' AS XCORD,
             2014 AS FY
        FROM
             DUAL
        UNION ALL
        SELECT
             6658 AS CID,
             300 AS VAL,
             'X1' AS XCORD,
             2015 AS FY
        FROM
             DUAL
        UNION ALL
        SELECT
             6658 AS CID,
             0 AS VAL,
             'X2' AS XCORD,
             2015 AS FY
        FROM
             DUAL
        UNION ALL
        SELECT
             6658 AS CID,
             0 AS VAL,
             'X3' AS XCORD,
             2015 AS FY
        FROM
             DUAL
        UNION ALL
        SELECT
             6658 AS CID,
             400 AS VAL,
             'X4' AS XCORD,
             2015 AS FY
        FROM
             DUAL
        UNION ALL
        SELECT
             6659 AS CID,
             500 AS VAL,
             'X1' AS XCORD,
             2016 AS FY
        FROM
             DUAL
        UNION ALL
        SELECT
             6659 AS CID,
             0 AS VAL,
             'X2' AS XCORD,
             2016 AS FY
        FROM
             DUAL
        UNION ALL
        SELECT
             6659 AS CID,
             0 AS VAL,
             'X3' AS XCORD,
             2016 AS FY
        FROM
             DUAL
        UNION ALL
        SELECT
             6659 AS CID,
             600 AS VAL,
             'X4' AS XCORD,
             2016 AS FY
        FROM
             DUAL)
SELECT
      *
FROM
      (SELECT
            XCORD,
            FY,
            SUM ( VAL ) AS VAL
       FROM
            TEMP1
       GROUP BY
            XCORD,
            FY) PIVOT (SUM ( VAL ) FOR FY IN ('2014', '2015', '2016'))
ORDER BY
      XCORD;
结果:

XCORD   '2014'  '2015'  '2016'
-----   ------  ------  ------
X1  100 300 500
X2  0   0   0
X3  0   0   0
X4  200 400 600
如果查看数据集,可以看到结果是

CID     VAL     XCORD   FY
----    ----    -----   ----
6657    100 X1  2014
6657    0   X2  2014
6657    0   X3  2014
6657    200 X4  2014
6658    300 X1  2015
6658    0   X2  2015
6658    0   X3  2015
6658    400 X4  2015
6659    500 X1  2016
6659    0   X2  2016
6659    0   X3  2016
6659    600 X4  2016

这或多或少是对数据的取消pivot。

您可以使用取消pivot和pivot的组合来完成

select * from 
    (select * from 
    (select x1,x2,x3,x4,fy from table1) 
    unpivot(val for x in (x1,x2,x3,x4)))
pivot(sum(val) for fy in (2014,2015,2016))

你知道如何使用
pivot
吗?我正在使用oracle 11g。可能有一种情况,我们的查询输出中有n个年份,因此转置的查询应该有n+1列