1

假设我有以下行:

VARIABLENAME   YYYYMM   XXXXYY   DATAOBS
variable_1   | 201101 | 111100 | 20
variable_2   | 201101 | 111100 | 20
variable_1   | 201102 | 111100 | 30
variable_2   | 201102 | 111100 | 30
variable_1   | 201101 | 222211 | 20
variable_2   | 201101 | 222211 | 20
variable_1   | 201102 | 222211 | 30
variable_2   | 201102 | 222211 | 30

我想知道如何得到结果:

VARIABLENAME      YYYYMM    XXXXYY   DATAOBS
variables_1and2 | 201101  | 111100 | 40
variables_1and2 | 201102  | 111100 | 60
variables_1and2 | 201101  | 222211 | 40
variables_1and2 | 201102  | 222211 | 60

其中在每个相应XXXXYY内的每个相应YYYYMM内包含variable_1variable_2的行中的所有DATAOBS都被添加并放置在新行variables_1and2中,仍在它们各自的YYYYMM和相应XXXXYY 内

如果有必要知道,我正在处理的实际数据中有数百个不同的 YYYYMM 和 XXXXYY。

提前致谢!

4

2 回答 2

7

听起来你只是想要

SELECT 'variables_1and2' variablename,
       yyyymm,
       xxxxyy,
       sum(dataobs) dataobs
  FROM your_table
 WHERE variablename in ('variable_1', 'variable_2' )
 GROUP BY yyyymm, xxxxyy

如果打算将这些行重新插入到您的表中,您需要一个INSERT

INSERT INTO your_table( variablename, yyyymm, xxxxyy, dataobs )
  SELECT 'variables_1and2' variablename,
         yyyymm,
         xxxxyy,
         sum(dataobs) dataobs
    FROM your_table
   WHERE variablename in ('variable_1', 'variable_2' )
   GROUP BY yyyymm, xxxxyy

当然,将详细数据和聚合数据存储在同一个表中是非常不寻常的。这通常是一个糟糕的设计。

于 2012-07-12T17:30:39.610 回答
1

您使用的是什么版本的 Oracle?你可以做(​​10g):

select wm_concat(variablename),yyyymm,xxxxyy, sum(dataobs) dataobs
from table
group by yyyymm,xxxxyy

如果你有 11g 第 2 版,你可以使用list_agg(variablename,',')

于 2012-07-12T17:46:15.687 回答