我希望看到经常帐户代码(FTABLE_ACCT_CODE)从列表中使用在过去5年。如果它们用得不多的话,我想把它们关掉。
我尝试了以下方法
select distinct FTABLE_ACCT_CODE, Count(FTABLE_ACTIVITY_DATE), FTABLE_ACTIVITY_DATE
from FTable
where FTABLE_ACCT_CODE IN ('1000','1001')
and FTABLE_ACTIVITY_DATE >= '15-May-2018'
GROUP BY FTABLE_ACCT_CODE, FTABLE_ACTIVITY_DATE
我希望每个ACCT_CODE只有一行,说明在过去5年中最后一次使用它的时间和次数。但是我的代码显示了超过70行,并且在过去5年中每次使用ACCT_CODE。
3条答案
按热度按时间dgsult0t1#
您不需要同时使用distinct和group by。包括日期也会给你带来麻烦。按如下方法再试一次
不知道这是否对你也有意义,但我认为值得一提的是,如果某些行中有null日期值,count(FTABLE_ACTIVITY_DATE)可能会有与count()不同的结果。count()返回行数,而count(FTABLE_ACTIVITY_DATE)返回FTABLE_ACTIVITY_DATE不为null的行数。
ccgok5k52#
您不希望按日期分组,只希望按帐户代码分组。您不希望结果行中包含日期。
js5cn81o3#
你运行的代码(并且已经被建议)今天可以工作,但是明天(和后天,以及......)将不再工作,因为你正在比较
ftable_activity_date
到一个 * 常数 *...对于第一个问题,考虑引用
sysdate
;它返回日期和时间,所以你甚至可能想要截断它(即设置为午夜)。此外,使用add_months
函数并 * 减去 * 60个月(12个月 * 5年)。它应该可以在任何日期工作,照顾闰年和诸如此类的事情。对于第二个问题,
'15-May-2018'
是一个字符串,您依赖于Oracle的隐式数据类型转换功能。有时候会成功,有时候不会。例如,您的代码-在我的数据库中(如果NLS更改,则在您的数据库中)-将无法工作:因此,如果您想将活动日期与 * 常量 * 进行比较,则可以使用日期文字(由
date
关键字和用单引号括起来的日期值组成,遵循yyyy-mm-dd
),或者使用具有适当格式模型的to_date
函数和可选的NLS子句(如果您将传递月份名称)。这将工作,总是和无处不在:所以:你可能感兴趣的代码是