Mysql SQL查询中的复杂计算

Mysql SQL查询中的复杂计算,mysql,sql,oracle,oracle-xe,ora-00932,Mysql,Sql,Oracle,Oracle Xe,Ora 00932,昨天我用同样的代码发布了一个类似的问题,我已经重写了,它应该是一个新规范的完美之选,但由于某些原因它不起作用 我正在使用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 no

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

我正在使用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并添加以下WHERE函数同样简单:

AND contract.start_date >= 01-01-10
AND contract.expiry_date <= 01-01-11
我已经正确地使用插入日期来指定日期。我的讲师花了一个小时和我一起研究为什么这不管用,但没有用

它不断返回错误-ORA-00932:不一致的数据类型:预期的字符数

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

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。

你能试试我用NVL函数替换了你的coalesce吗

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

你能试试我用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

Phil,根据我能想到的top的任何定义,您使用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方法将起作用。通常,我建议不要在视图定义中按顺序排序。

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。

我似乎无法在此处正确格式化代码,这是浏览器错误吗?有什么建议吗?@Phil:看看。@NullUserException:嘿,你回来了!已经很长时间了:@NullUserException-感谢您格式化此文件properly@BoltClock谢谢你的链接,我会尽快阅读的。我似乎无法在这里正确格式化我的代码,这是浏览器错误吗?有什么建议吗?@Phil:看看。@NullUserException:嘿,你回来了!已经很长时间了:@NullUserException-感谢您格式化此文件properly@BoltClock谢谢你的链接,这项作业一结束,我就开始阅读了!你赢了我!该死的电话铃响了-那是我在电话里试图和你说话,这样我就可以在这里收集到一两分-你能做一个描述合同吗?只是想检查一下数据类型库,不确定描述合同是什么?您的意思是想查看我的合同创建表吗?如果您只在日期中指定世纪信息,这个答案会更好。所以,你不应该写信给日期'01-01-11'、'MM-DD-YY',而应该写信给日期'01-01-2011'、'MM-DD-YYYY'或者干脆写日期'2011-01-01'!你赢了我!该死的电话铃响了-那是我在电话里试图和你说话,这样我就可以在这里收集到一两分-你能做一个描述合同吗?只是想检查一下数据类型库,不确定描述合同是什么?您的意思是想查看我的合同创建表吗?如果您只在日期中指定世纪信息,这个答案会更好。因此,你应该写信给日期'01-01-11'、'MM-DD-YY',而不是'01-01-11'、'MM-DD-YYYY'或简单的日期'2011-01-01'。我只是通过订购来达到顶部,这样最高收入者排在第一位,并且只显示第一行的百分比,但这显然更准确。。。。嗯,这是对的,这是不同的。。谢谢。我只是通过订购来达到顶部,这样最高收入者排在第一位,并且只显示前%的行,但这显然要准确得多。。。。嗯,这是对的,这是不同的。。非常感谢。