Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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_Oracle_Group By_Pivot_Aggregation - Fatal编程技术网

在SQL查询中将数据重新排列为多列

在SQL查询中将数据重新排列为多列,sql,oracle,group-by,pivot,aggregation,Sql,Oracle,Group By,Pivot,Aggregation,我正在从数据库中提取timeseries数据,WARE数据按行存储,还存储了一个类型字段。(即,该表具有时间戳、数据类型和值字段) 数据中有固定数量的不同数据类型,我需要将每种数据类型作为一列进行结构化 Timestamp Offset Multi Value Output ------------------------------------------- 2019-07-22 0,7047 0,9805 6,6526 1,1223 2019-07-23 0,7005

我正在从数据库中提取timeseries数据,WARE数据按行存储,还存储了一个类型字段。(即,该表具有时间戳、数据类型和值字段)

数据中有固定数量的不同数据类型,我需要将每种数据类型作为一列进行结构化

Timestamp   Offset  Multi   Value   Output
-------------------------------------------
2019-07-22  0,7047  0,9805  6,6526  1,1223
2019-07-23  0,7005  0,9850  6,6955  1,1150
2019-07-24  0,6980  0,9855  6,6995  1,1143
这可以在SQL查询中执行吗


我希望在查询中执行此操作的原因是,我在应用程序界面中运行查询,然后将结果输出到一个表中,该表可以复制粘贴到工具中,而无需手动重新排列。(也就是说,我不是作为程序的一部分执行查询,因此我不能在SQL查询之外的任何代码中执行查询)

如果列数是固定的,您可以使用CASE-pivot方法-

SELECT Timestamp
      ,MAX(CASE WHEN  Type = 'Offset' THEN Value END) Offset
      ,MAX(CASE WHEN  Type = 'Multi' THEN Value END) Multi
      ,MAX(CASE WHEN  Type = 'Value' THEN Value END) Value
      ,MAX(CASE WHEN  Type = 'Output' THEN Value END) Output
FROM YOUR_TABLE
GROUP BY Timestamp;

您可以使用条件聚合:

 select Timestamp, 
        max(case when Type = 'Offset' Then Value end) as Offset, 
        max(case when Type = 'Multi' Then Value end) as Multi,  
        max(case when Type = 'Value' Then Value end) as Value,
        max(case when Type = 'Output' Then Value end) as Output
   from tab
  group by Timestamp
  order by Timestamp;
另一个选项是使用带有
pivot
关键字的查询:

select *
  from
  (
    select * 
      from tab
  ) 
  pivot(
         max(value) for Type in ( 'Offset' as "Offset", 'Multi' as "Multi", 
                                  'Value' as "Value", 'Output' as "Output" )
       )
  order by Timestamp;

如果时间戳列具有分数时间分量,并且希望将其截断为秒,则如下所示:

SELECT cast (systimestamp as date) ddate
  ,MAX(DECODE  (Type, 'Offset', Value)) Offset
  ,MAX(DECODE  (Type, 'Multi',  Value)) Multi
  ,MAX(DECODE  (Type, 'Value',  Value)) Value
  ,MAX(DECODE  (Type, 'Output', Value)) Output
FROM YOUR_TABLE
GROUP BY cast (systimestamp as date);

按时间戳分组,选择列表中多个etc的用例表达式。
SELECT cast (systimestamp as date) ddate
  ,MAX(DECODE  (Type, 'Offset', Value)) Offset
  ,MAX(DECODE  (Type, 'Multi',  Value)) Multi
  ,MAX(DECODE  (Type, 'Value',  Value)) Value
  ,MAX(DECODE  (Type, 'Output', Value)) Output
FROM YOUR_TABLE
GROUP BY cast (systimestamp as date);