我使用来自几个不同帖子的建议将以下代码拼凑在一起并且已经碰壁了。我对此代码的最终目标是查找从去年10月1日到当年9月30日的记录,而不会提示用户输入或必须在两个语句之间硬编码日期范围。我正在运行代码时收到以下错误“绑定变量”End_Year“未声明”。
declare
begin_Year date;
begin
select trunc(sysdate, 'YEAR')-92 FY_begin_year
Into begin_Year
from Dual;
end;
declare
End_Year date;
begin
select add_months(trunc(sysdate, 'YEAR'), 12)-93 FY_end_year
into End_Year
from dual;
end;
SELECT inv.company as company
, inv.customer_id as cust
, inv.address_id
,inv.invdate
, SUM(inv.sales) as sales
, SUM(inv.cost) as costs
FROM ifsinfo.hb_invoicing_all inv
WHERE inv.site IN ('06','01')
AND TO_DATE(inv.invdate) between :begin_Year and :End_Year
GROUP BY inv.company
, inv.customer_id
, inv.address_id
, inv.invdate
答案 0 :(得分:0)
您的查询有几个问题,首先是将alias
赋予into
子句。此外,您必须将所有语句封装在1 PLSQL
块中。
您还要对选择查询做什么。你在其他地方显示输出吗?
最简单的方法是直接使用下面的查询,而不是使用2个不同的变量。
SELECT inv.company as company
, inv.customer_id as cust
, inv.address_id
,inv.invdate
, SUM(inv.sales) as sales
, SUM(inv.cost) as costs
FROM ifsinfo.hb_invoicing_all inv
WHERE inv.site IN ('06','01')
AND TO_DATE(inv.invdate)
between
trunc(sysdate, 'YEAR')-92
and
add_months(trunc(sysdate, 'YEAR'), 12)-93
GROUP BY inv.company
, inv.customer_id
, inv.address_id
, inv.invdate
如果您必须使用变量,请将它们放在同一个plsql
块中。
答案 1 :(得分:0)
正如其他人所说 - 您不需要任何plsql
阻止 - 只需sql
个查询。
现在关于你的主要目标
此代码的最终目标是从最后一个10月1日开始查找记录 当年9月30日当年没有提示用户 输入或必须在声明之间硬编码日期范围
鉴于去年10月1日可以找到
to_date('01/10/'|| (to_number(to_char(sysdate,'YYYY'))-1),'dd/mm/rrrr')
和 当年9月30日
to_date('30/09/'|| to_char(sysdate,'YYYY'),'dd/mm/rrrr')
您的查询变为
SELECT inv.company as company
, inv.customer_id as cust
, inv.address_id
,inv.invdate
, SUM(inv.sales) as sales
, SUM(inv.cost) as costs
FROM ifsinfo.hb_invoicing_all inv
WHERE inv.site IN ('06','01')
AND TO_DATE(inv.invdate)
between
to_date('01/10/'|| (to_number(to_char(sysdate,'YYYY'))-1),'dd/mm/rrrr')
and
to_date('30/09/'|| to_char(sysdate,'YYYY'),'dd/mm/rrrr')
GROUP BY inv.company
, inv.customer_id
, inv.address_id
, inv.invdate
这只是另一种方法,可能更多'程序员友好'。
如果您决定在某一天查看日期,则无需计算93
中92
和trunc(sysdate, 'YEAR')-92
所代表的内容(您的方法)。