我真的被这个任务困住了——我需要根据特定的标准用“0”值的行填充报表,下面是示例:
假设我们有一个表 BROKERS,其中包含公司名称、他们的交易类型和当前月份和所有月份的累计金额。
COMPANY TRAN_TYPE CURR_MNTH ALL_MNTH
Broker1 CURRENCY_SELL $1000.00 $1500000.00
Broker1 GOLD_SELL $50000.00 $2500000.00
Broker1 GOLD_BUY $80000.00 $8500000.00
Broker1 STOCKS_SELL $35000.00 $3500000.00
表 BROKERS 没有字段 TRAN_TYPE,但有一个字段 TRAN_TYPE_CD,它引用另一个名为 TRAN_TYPE_CD_EXPL 的表,其中解释了所有代码:
TRAN_TYPE_CD TRAN_TYPE_CD_EXPLD
1 STOCKS_SELL
2 STOCKS_BUY
3 GOLD_SELL
4 GOLD_BUY
5 SILVER_SELL
6 SILVER_BUY
7 COPPER_SELL
8 COPPER_BUY
9 CURRENCY_SELL
10 CURRENCY_BUY
所以上面显示的结果只是这两个表的简单连接:
select b.COMPANY, tt.TRAN_TYPE, b.CURR_MONTH, b.ALL_MNTH
from BROKERS b, TRAN_TYPE_CD_EXPL tt
where b.TRAN_TYPE_CD = tt.TRAN_TYPE_CD;
一切都很简单,但问题就从这里开始:我正在处理的报告应该如下所示:
COMPANY MARKET TRAN_TYPE CURR_MNTH ALL_MNTH
Broker1 FOREX CURRENCY_SELL $1000.00 $1500000.00
Broker1 FOREX CURRENCY_BUY $0.00 $5500000.00
Broker1 CONTRACTS GOLD_SELL $50000.00 $2500000.00
Broker1 CONTRACTS GOLD_BUY $80000.00 $8500000.00
Broker1 STOCKMARKET STOCKS_SELL $35000.00 $3500000.00
Broker1 STOCKMARKET STOCKS_BUY $0.00 $9500000.00
所以让我解释一下:首先,报告应该包含一个列 MARKET,它应该根据列 TRAN_TYPE 中的值填充,但问题是数据库中没有表 MARKET,所以每次你需要在一个报告或其他地方,您需要像这样使用解码(假设每个人都知道所有类型的 tran_types 属于哪里):
SELECT DECODE (TRAN_TYPE_CD_EXPL.TRAN_TYPE_CD_EXPLD,
'CURRENCY_SELL', 'FOREX',
'CURRENCY_BUY', 'FOREX',
'STOCKS_SELL', 'STOCKMARKET',
'STOCKS_BUY', 'STOCKMARKET') AS MARKET,
或基于 TRAN_TYPE_CD 值:
SELECT DECODE (BROKERS.TRAN_TYPE_CD,
9, 'FOREX',
10, 'FOREX',
1, 'STOCKMARKET',
2, 'STOCKMARKET') AS MARKET,
2) 问题 2 更复杂:报告逻辑说 - 公司在特定组中至少有一笔交易(假设市场类型为 'FOREX' 的 CURRENCY_SELL),报告应填充市场类型中的其他 tran_types即使您这家公司在本月没有任何这些交易,也可以用 0 美元分组。所以在这种情况下,它应该填充行
Broker1 FOREX CURRENCY_BUY $0.00 $5500000.00
和
Broker1 STOCKMARKET STOCKS_BUY $0.00 $9500000.00
问题是它将在 unix 上通过 plsql 批处理执行,因此它必须是单个查询。
非常感谢任何想法和/或建议!
谢谢
附言
它的oracle 11gr2,具有只读角色。