oracle 如何查找在过去5年中使用代码的次数

kmynzznz  于 2023-05-22  发布在  Oracle
关注(0)|答案(3)|浏览(120)

我希望看到经常帐户代码(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。

dgsult0t

dgsult0t1#

您不需要同时使用distinct和group by。包括日期也会给你带来麻烦。按如下方法再试一次

select FTABLE_ACCT_CODE, Count(FTABLE_ACTIVITY_DATE)
from FTable
where FTABLE_ACCT_CODE IN ('1000','1001')
and FTABLE_ACTIVITY_DATE >= '15-May-2018'
GROUP BY FTABLE_ACCT_CODE

不知道这是否对你也有意义,但我认为值得一提的是,如果某些行中有null日期值,count(FTABLE_ACTIVITY_DATE)可能会有与count()不同的结果。count()返回行数,而count(FTABLE_ACTIVITY_DATE)返回FTABLE_ACTIVITY_DATE不为null的行数。

ccgok5k5

ccgok5k52#

您不希望按日期分组,只希望按帐户代码分组。您不希望结果行中包含日期。

select FTABLE_ACCT_CODE, Count(FTABLE_ACTIVITY_DATE)
from FTable
where FTABLE_ACCT_CODE IN ('1000','1001')
and FTABLE_ACTIVITY_DATE >= '15-May-2018'
group by FTABLE_ACCT_CODE;
js5cn81o

js5cn81o3#

你运行的代码(并且已经被建议)今天可以工作,但是明天(和后天,以及......)将不再工作,因为你正在比较

  • ftable_activity_date到一个 * 常数 *...
  • ...这是(使事情变得更糟)一个字符串

对于第一个问题,考虑引用sysdate;它返回日期和时间,所以你甚至可能想要截断它(即设置为午夜)。此外,使用add_months函数并 * 减去 * 60个月(12个月 * 5年)。它应该可以在任何日期工作,照顾闰年和诸如此类的事情。

SQL> select trunc(sysdate),
  2    add_months(trunc(sysdate), -12 * 5)
  3  from dual;

TRUNC(SYSD ADD_MONTHS
---------- ----------
16.05.2023 16.05.2018

SQL>

对于第二个问题,'15-May-2018'是一个字符串,您依赖于Oracle的隐式数据类型转换功能。有时候会成功,有时候不会。例如,您的代码-在我的数据库中(如果NLS更改,则在您的数据库中)-将无法工作:

SQL> select * from emp where hiredate > '15-May-2018';
select * from emp where hiredate > '15-May-2018'
                                   *
ERROR at line 1:
ORA-01843: not a valid month

因此,如果您想将活动日期与 * 常量 * 进行比较,则可以使用日期文字(由date关键字和用单引号括起来的日期值组成,遵循yyyy-mm-dd),或者使用具有适当格式模型的to_date函数和可选的NLS子句(如果您将传递月份名称)。这将工作,总是和无处不在:

ftable_activity_date >= date '2018-05-15'
ftable_activity_date >= to_date('15-May-2018', 'dd-Mon-yyyy', 'nls_date_language = english')
ftable_activity_date >= to_date('15.05.2018', 'dd.mm.yyyy')

所以:你可能感兴趣的代码是

select ftable_acct_code, 
       count(ftable_activity_date) cnt
from ftable
where ftable_acct_code in ('1000', '1001')
  and ftable_activity_date >= add_months(trunc(sysdate), -12 * 5)
group by ftable_acct_code;

相关问题