在返回值的更新中标识的列

时间:2013-09-17 17:04:38

标签: sql oracle

我尝试使用列变量更新一个表。 例如:

Table: BILLING (ORIGIN OF DATA)
Columns: 
- CUSTOMER
- PERIOD
- REVENUE

TABLE: BILLING_MONTHLY
Columns:
- CUSTOMER
- M201301 (this value is REVENUE per year/month)
- M201302 (this value is REVENUE per year/month)
- M201303 (this value is REVENUE per year/month)

我需要使用BILLING(PERIOD)的值列更新BILLING_MONTHLY,但是在表BILLING的选择中,我没有在更新中获得set column。

示例:

表格支付

CUSTOMER    PERIOD  REVENUE
05031       201301  1000
05013       201301  550
05031       201302  800
05032       201303  930
05031       201303  880

预期结果

表BILLING_MONTHLY

CUSTOMER    M201301         M201302         M201303
05013       550
05031       1000            800             880
05032                                       930

我的想法: 1)创建“FOR”以在BILLING_MONTHLY中插入客户; 2)为每年/每月的客户创建“更新”;

问题:我没有'在功能上获得更新结果是列。

创建调查:

CREATE TABLE BILLING
(
 CUSTOMER  VARCHAR2(5 BYTE),
 PERIOD    VARCHAR2(6 BYTE),
 REVENUE   NUMBER
);

INSERT INTO BILLING (CUSTOMER, PERIOD, REVENUE) VALUES ('05031', '201301', 1000);
INSERT INTO BILLING (CUSTOMER, PERIOD, REVENUE) VALUES ('05013', '201301', 550);
INSERT INTO BILLING (CUSTOMER, PERIOD, REVENUE) VALUES ('05031', '201302', 800);
INSERT INTO BILLING (CUSTOMER, PERIOD, REVENUE) VALUES ('05032', '201303', 930);
INSERT INTO BILLING (CUSTOMER, PERIOD, REVENUE) VALUES ('05031', '201303', 880);
COMMIT;

CREATE TABLE BILLING_MONTH
(
  CUSTOMER  VARCHAR2(5 BYTE),
  M201301   NUMBER,
  M201302   NUMBER,
  M201303   NUMBER
);

有人可以帮帮我吗? 提前谢谢!

1 个答案:

答案 0 :(得分:0)

这就是你想要的

select customer, sum(c1) M201301, sum(c2) M201302, sum(c3) M201303

from(
select customer,
case when period='201301' then revenue else 0 end 'C1',
case when period='201302' then revenue else 0 end 'C2',
case when period='201303' then revenue else 0 end 'C3'
from billing
) t

group by customer

您需要自己控制结果的范围列名。如果此查询是编码的一部分,您可以让代码处理

sqlfiddle here http://sqlfiddle.com/#!2/7aa98/13