我正在尝试为客户创建一个特定于他们当前需要的日期范围的报告,但是我有几个问题。
最大的一个是,如何使我的用户输入提示Enter_Start_Date
和Enter_End_Date
仅出现一次?(即开始:1月1日至18日,结束:28-FEB-18)。我试图在这里研究其他问题,并且有一个建议(对该用户有用)做A&&在其他发生之前使用相同的变量名称,但是当我运行查询时,我仍然会提示4次。
我遇到的另一个"问题"是下面的查询并没有像应有的那样返回parts_used
和h_repairs
的结果。
SELECT
a.h_desc,
a.fic,
a.p_part,
a.d_part,
a.nomenclature,
a.qpe,
SUM(b.qty) AS parts_used,
COUNT(c.fic) AS h_repairs,
a.cdf_ohb,
a.bmc
FROM
t_table_a a
LEFT JOIN t_table_b b ON b.fic = a.fic
AND b.part_no = a.d_part
AND b.real_f_date BETWEEN TO_DATE('&Enter_Start_Date', 'DD-MON-YY') AND TO_DATE('&Enter_End_Date'
, 'DD-MON-YY')
LEFT JOIN t_table_c c ON c.fic = a.fic
AND c.real_f_date BETWEEN TO_DATE('&&Enter_Start_Date', 'DD-MON-YY') AND TO_DATE('&&Enter_End_Date',
'DD-MON-YY')
GROUP BY
a.bmc,
a.cdf_ohb,
a.d_part,
a.fic,
a.h_desc,
a.nomenclature,
a.p_part,
a.qpe
ORDER BY
a.fic,
a.p_part
当我进行上述查询时,parts_used
和h_repairs
列完全不折磨,但是当我像在以下查询中一样嵌套加入时,结果如预期的。
SELECT
t.h_desc,
t.fic,
t.p_part,
t.d_part,
t.nomenclature,
t.qpe,
COUNT(c.fic) AS h_repairs,
t.parts_used,
t.cdf_ohb,
t.bmc
FROM
(
SELECT
a.h_desc,
a.fic,
a.p_part,
a.d_part,
a.nomenclature,
a.qpe,
SUM(b.qty) AS parts_used,
a.cdf_ohb,
a.bmc
FROM
t_table_a a
LEFT JOIN t_table_b b ON b.fic = a.fic
AND b.part_no = a.d_part
AND b.real_f_date BETWEEN TO_DATE('&Enter_Start_Date', 'DD-MON-YY') AND TO_DATE('&Enter_End_Date'
, 'DD-MON-YY')
GROUP BY
a.bmc,
a.cdf_ohb,
a.d_part,
a.fic,
a.h_desc,
a.nomenclature,
a.p_part,
a.qpe
) t
LEFT JOIN t_table_c c ON c.fic = t.fic
AND c.real_f_date BETWEEN TO_DATE('&&Enter_Start_Date', 'DD-MON-YY') AND TO_DATE('&&Enter_End_Date',
'DD-MON-YY')
GROUP BY
t.h_desc,
t.fic,
t.p_part,
t.d_part,
t.nomenclature,
t.qpe,
t.parts_used,
t.cdf_ohb,
t.bmc
ORDER BY
t.fic,
t.p_part
是嵌套加入需要发生的事情,还是我在做一些问题?
您仅将第二个替换变量的第二个引用从 &
更改为 &&
。如果您更改所有这些,则只会提示每个人一次。(不确定为什么要这样做,但是SQL*Plus也这样做)。
您还可以通过在查询之前将这些语句添加到您的脚本:
来提示一条更好的消息:accept Enter_Start_Date date format "DD-MON-YY" prompt "Enter the start date in the format 'DD-MON-YY'"
accept Enter_End_Date date format "DD-MON-YY" prompt "Enter the end date in the format 'DD-MON-YY'"
也可以定义变量,然后在引用它们时可以使用sing &
或double &&
(并且您可以使用较短的名称;当然可以使用您自己的提示文本)。
如果您还可以选择其他日期格式,那不依赖用户的会话日期语言(因为缩写依赖于NLS),最好使用4位年份,并且是明确的 - 所以也许是yyyy-mm-dd,而不是dd/mm/yyyy,尽管我想我觉得那个尴尬。(如果您愿意,这也可以让您将日期文字用作奖金)。由于提示可以包含您期望的格式,他们至少知道他们应该输入什么,但是他们仍然不喜欢它。