**已关闭。**此问题需要debugging details。当前不接受答案。
编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
3天前关闭。
Improve this question
我试图根据采购工具的第一次交易及其在Oracle数据库中的状态来查找它们的使用寿命。我使用CASE函数创建了一个新列,该列为不具有此状态的工具返回“活动工具”,并返回报废日期(如果有)。然后,我想:根据该列计算工具的使用年限。如果工具仍处于“活动...”状态,则使用今天的日期减去第一个状态日期。如果工具已报废,则应从第一个状态日期减去报废日期。
我可以呈现列,但我不知道如何创建列(多行?)子查询以便引用它。下面的代码是我天真的假设,我知道它不会工作。
SELECT SERIALTOOL.SERIALID,
SERIALTOOL.ITEMNUMBER,
MIN (SERIALTOOL.STATUSDATE) AS "Purchase Date",
CASE
WHEN SERIALTOOL.STATUS = 5 THEN TO_CHAR (SERIALTOOL.STATUSDATE)
ELSE 'Active Tool'
END AS "Scrap Date",
CASE
WHEN "Scrap Date" = 'Active Tool'
THEN CURRENT_DATE - MIN (SERIALTOOL.STATUSDATE)
ELSE "Scrap Date" - MIN (SERIALTOOL.STATUSDATE)
END AS "TOOL AGE"
FROM SERVER.SERIALTOOL SERIALTOOL
3条答案
按热度按时间ghg1uchk1#
实际上已经很接近了,为了混合聚合列和非聚合列,必须使用窗口(
OVER
子句),并且由于在派生列上使用CASE逻辑,因此需要嵌套查询块,如下所示:哦,你可能应该坚持使用Oracle合法的列名,这样你就不需要“”和区分大小写了。所有的大写,除了_和#之外没有特殊的字符,并且以字母字符开头。
dohp0rv52#
依据是:
serialtool.serialid
标识工具serialtool.itemnumber
列出每个工具的事务serialtool.itemnumber = 1
表示购买交易serialtool.status = 5
表示刀具已报废我的建议是这样的:
对于前面的答案,我更喜欢关键字和Oracle提供的函数使用大写字母;用户定义的名称为小写。
对于
NVL2()
之前的版本,请使用DECODE (scr.serialid, NULL, 'Active', 'Scrapped')
46scxncf3#
多亏了@rgm575,我意识到有一个“DATEINSERVICE”字段可以使用,并且可以避免使用最早的状态日期。多亏了@paul-w,它给了我大量的子查询信息。此外,为了保持简单,我保留了日期,即使是仍然在使用的项目,并添加了一个额外的列来显示工具的状态。