查看本月未付的账单

时间:2012-11-23 09:30:36

标签: sql oracle

我的目标是查看SEP / 2012月份尚未支付的账单

create view Viewe as
  select companyname,salutation,firstname,lastname, billingadd, billing.latestatus
  from CUSTOMER, CUST_NONRES, BILLING
  where cust_nonres.customerid = billing.custid
  and to_date(to_char(billingdate, 'MON-YYYY')) = to_date('092012', 'MON-YYYY')
  and PAID = 'NO';

当我从viewe

中选择*时,这是我的错误
  

ORA-01858:找到数字所在的非数字字符   预期   01858. 00000 - “找到了数字所在的非数字字符”   *原因:使用日期格式模型转换的输入数据是              不正确。输入数据不包含数字所在的数字              格式模型要求。   *操作:修复输入数据或日期格式模型以确保              元素在数量和类型上匹配。然后重试该操作。

感谢您的帮助。


我已将其更改为:

create view Viewe as
select companyname,salutation,firstname,lastname, billingadd, billingdate, billing.latestatus, amount
from CUSTOMER, CUST_NONRES, BILLING
where cust_nonres.customerid = billing.custid
and customer.customerid = cust_nonres.customerid
and TRUNC(billingdate, 'MM') = to_date('092012', 'MMYYYY')
and PAID = 'NO';

--------------------------- UPDATE

嗨,大家好,任何人都可以帮助我,我怎么可能总结一下,我可以使用什么语法来汇总生成的条目。感谢。

1 个答案:

答案 0 :(得分:1)

试试这个

create view Viewe as
select companyname,salutation,firstname,lastname, billingadd, billing.latestatus
from CUSTOMER, CUST_NONRES, BILLING
where cust_nonres.customerid = billing.custid
and TRUNC(billingdate, 'MM') = to_date('092012', 'MMYYYY')
and PAID = 'NO';

这将解决日期错误消息的问题。

背后的逻辑是TRUNC函数将日期(因此名称)截断为指定的字段。它可能比转换为字符串然后更新要快得多。

然而你会得到不好的结果!您有 3 表,并且只有 1 表达式指定它们之间的连接!这将给你非常奇怪的结果(由未指定的链接引起的笛卡尔积产生的重复)。我还建议使用JOIN ON语法,因为它更具可读性(优化器无论如何都会处理它):

create view Viewe as
select companyname,salutation,firstname,lastname, billingadd, billing.latestatus
from CUSTOMER
JOIN CUST_NONRES ON cust_nonres.customerid = customer.customerid --this is just a guess
JOIN BILLING ON cust_nonres.customerid = billing.custid
where 
and TRUNC(billing.billingdate, 'MM') = to_date('092012', 'MMYYYY')
and PAID = 'NO';

由于我以这种方式编写查询,因此我永远不会忘记添加正确的表达式来连接表,而使用WHERE子句连接表我偶尔犯了一个错误 - 有时确实需要时间来查找错误。

另外,请记住,如果你做了很多像这样的连接,你应该考虑使用Oracle function based indexes,就像这样:

CREATE INDEX IDX_BILLINGDATE_TRUNC_MM ON BILLING(TRUNC(BILLINGDATE,'MM'));

因为这将显着提高连接性能。

此外,根据手头数据的数量,您可以阅读partitioning

推荐阅读