【问题标题】:Complicated Calculation within SQL QuerySQL 查询中的复杂计算
【发布时间】:2011-03-03 21:06:35
【问题描述】:

我昨天用相同的代码发布了一个类似的问题,我已经重写了它应该是完美的新规范,但由于某种原因它不起作用。

我正在使用 Oracle 10g Express。

下面的代码计算出收入最高的 10% 的律师。

CREATE VIEW rich_solicitors AS
select notes.time_spent*rate.rate_amnt+coalesce(special_rate.s_rate_amnt,0)
AS solicitor_made, notes.solicitor_id
FROM notes, rate, solicitor_rate, solicitor, case, contract, special_rate
WHERE notes.solicitor_id = solicitor.solicitor_id
AND solicitor.solicitor_id = solicitor_rate.solicitor_id
AND solicitor_rate.rate_id = rate.rate_id
AND notes.case_id = case.case_id
AND case.contract_id = contract.contract_id
AND contract.contract_id = special_rate.contract_id (+)
ORDER BY -solicitor_made;


SELECT * FROM rich_solicitors
WHERE ROWNUM <= (SELECT COUNT(*)/10 FROM rich_solicitors);

我需要算出去年的前 10%,我认为这就像在 SELECT 中添加 start_date 和 expiry_date 并添加以下 WHERE 函数一样简单:

AND contract.start_date >= 01-01-10
AND contract.expiry_date <= 01-01-11

我已使用 TO_DATE 正确插入日期。我的讲师花了一个小时和我一起弄清楚为什么这不起作用但无济于事。

它不断返回错误 - ORA-00932:不一致的数据类型:预期的 CHAR 得到了 NUMBER

我也尝试定义日期格式,但仍然返回相同的错误

CREATE VIEW rich_solicitors1 AS
SELECT  notes.time_spent*rate.rate_amnt+coalesce(special_rate.s_rate_amnt,0) AS solicitor_made, notes.solicitor_id, TO_CHAR(contract.start_date, 'DD-MM-YY'), TO_CHAR(contract.expiry_date, 'DD-MM-YY')
FROM notes, rate, solicitor_rate, solicitor, case, contract, special_rate
WHERE notes.solicitor_id = solicitor.solicitor_id
AND solicitor.solicitor_id = solicitor_rate.solicitor_id
AND solicitor_rate.rate_id = rate.rate_id
AND notes.case_id = case.case_id
AND case.contract_id = contract.contract_id
AND contract.contract_id = special_rate.contract_id (+)
AND contract.start_date >= 01-01-10
AND contract.expiry_date <= 01-01-11
ORDER BY -solicitor_made;

有什么想法吗?

非常感谢,任何批评都非常感谢,我是一名学生,在这方面的第一步,大约 9 天前我根本没有 SQL 知识。

【问题讨论】:

  • 我似乎无法在此处正确格式化我的代码,是浏览器错误吗?有什么建议吗?
  • @NullUserException:嘿,你回来了!好久不见了:)
  • @NullUserException - 感谢您正确格式化
  • @BoltClock 谢谢你的链接,我会读一读,只要这个作业完成。

标签: mysql sql oracle oracle-xe ora-00932


【解决方案1】:

你能试试我已经用 NVL 函数替换了你的合并

SELECT  notes.time_spent*rate.rate_amnt+NVL(special_rate.s_rate_amnt,0) 
AS solicitor_made, notes.solicitor_id, TO_CHAR(contract.start_date, 'DD-MM-YY'), 
TO_CHAR(contract.expiry_date, 'DD-MM-YY') 
FROM notes, rate, solicitor_rate, solicitor, case, contract, special_rate 
WHERE notes.solicitor_id = solicitor.solicitor_id 
AND solicitor.solicitor_id = solicitor_rate.solicitor_id 
AND solicitor_rate.rate_id = rate.rate_id AND notes.case_id = case.case_id 
AND case.contract_id = contract.contract_id 
AND contract.contract_id = special_rate.contract_id (+) 
AND contract.start_date >= to_date('01-01-10','MM-DD-YY')
AND contract.expiry_date <= to_date('01-01-11' ,'MM-DD-YY')
ORDER BY solicitor_made

【讨论】:

  • 该死!你打败了我!该死的电话响了。 :-)
  • 那是我在电话里想和你说话,所以我可以在这里收集一两点;-)
  • 你能做一个 desc 合同只是想检查数据类型
  • 抱歉,不确定什么是 desc 合约?你的意思是你想看看我的合同创建表?
  • 如果您在日期中也指定了世纪信息,这个答案会好得多。所以,你应该写 to_date('01-01-2011' ,'MM-DD-YYYY') 或简单地写日期 '2011- 而不是 to_date('01-01-11' ,'MM-DD-YY') 01-01'。
【解决方案2】:

Phil,您使用 ROWNUM 的查询不会获得我能想到的任何“top”定义的前 10%。

一个例子是:

SELECT * FROM (
  SELECT solicitor_made, solicitor_id
        ,NTILE(10) OVER (ORDER BY solicitor_made DESC) decile
  FROM rich_solicitors
) WHERE decile = 1;

编辑

刚刚注意到您的视图定义中有一个 ORDER BY。在这种情况下,您的 ROWNUM 方法将起作用。通常我建议不要将 ORDER BY 放在视图定义中。

【讨论】:

  • 我只是通过排序来达到顶峰,因此最高收入者排在第一位,并且只显示前 % 的行,但这显然要准确得多....好吧,它是正确的不同..谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多