日期差异和 ORA-00937 - 不是单组函数

Date Difference and ORA-00937 - not a single-group group function

我正在尝试添加两个表并获取两个日期的总天数。但是有以下简单的问题:不是单组函数

这是我目前尝试过的方法:

SELECT COUNT(status) AS "Present Days",  
       (SELECT TRUNC(TO_DATE('01/10/2018', 'MM/DD/YYYY') - TO_DATE(k.JOINING_DATE, 'MM/DD/YYYY')) 
        FROM attendance m
             INNER JOIN EMP_OFFICIAL k 
             ON k.EMPNO = m.EMPNO 
        WHERE m.empno='EMP00254' 
        AND m.status='P') AS "Total Days" 
FROM attendance 
WHERE empno = 'EMP00254' 
AND status = 'P';

我可以不使用 DUAL 获得天数吗?

要么删除 COUNT(status) AS "Present Days" 部分和括号内的 SELECT :

SELECT (TRUNC(TO_DATE('01/10/2018', 'MM/DD/YYYY') - TO_DATE(k.JOINING_DATE, 'MM/DD/YYYY')) "time difference" FROM attendance m
INNER JOIN EMP_OFFICIAL k ON k.EMPNO = m.EMPNO where m.empno='EMP00254' and m.status='P') AS "Total Days" 
 FROM attendance where empno = 'EMP00254' and status = 'P';

使用如下(在sql末尾添加GROUP BY表达式):

SELECT COUNT(status) AS "Present Days",  
(TRUNC(TO_DATE('01/10/2018', 'MM/DD/YYYY') - TO_DATE(k.JOINING_DATE, 'MM/DD/YYYY')) "time difference" FROM attendance m
INNER JOIN EMP_OFFICIAL k ON k.EMPNO = m.EMPNO where m.empno='EMP00254' and m.status='P') AS "Total Days" 
 FROM attendance where empno = 'EMP00254' and status = 'P'
GROUP BY (TRUNC(TO_DATE('01/10/2018', 'MM/DD/YYYY') - TO_DATE(k.JOINING_DATE, 'MM/DD/YYYY'));

因为,grouppednon-groupped 项目不能一起使用。

顺便说一句,你不需要像 ( SELECT TRUNC(TO_DATE('01/10/2018', 'MM/DD/YYYY') - TO_DATE(k.JOINING_DATE, 'MM/DD/YYYY') FROM DUAL ) 那样在你的内联 select 语句中使用 dual,只需 ( TRUNC(TO_DATE('01/10/2018', 'MM/DD/YYYY') - TO_DATE(k.JOINING_DATE, 'MM/DD/YYYY')) 就足够了。

首先,该子查询很可能不是标量(看起来您假设多行可能来自出勤率 table),其次,它包含不必要的连接..

我会做的是:

select count(*) as "Present Days",
       to_date('01/10/2018', 'mm/dd/yyyy') - k.joining_date "Total Days"
from   attendance a
       inner join emp_official k on a.empno = k.empno
where  a.empno = 'EMP00254'
and    a.status = 'P'
group by to_date('01/10/2018', 'mm/dd/yyyy') - k.joining_date;

这确实假定 k.joining_date 列是 DATE 数据类型并且 'k.empno' 是唯一列。

如果每个员工在 EMP_OFFICIAL table 中只有一行,那么您可以这样做:

SELECT COUNT(a.status) AS "Present Days",  
       TRUNC( SYSDATE ) - TRUNC( MIN( k.joining_date ) ) AS "Total Days" 
FROM   attendance a
       RIGHT OUTER JOIN EMP_OFFICIAL k
       ON ( k.EMPNO = a.EMPNO )
WHERE  a.empno = 'EMP00254' 
WHERE  a.status = 'P';

或者您可以在子查询中进行聚合:

SELECT a."Present Days",  
       TRUNC( SYSDATE ) - TRUNC( k.joining_date ) AS "Total Days" 
FROM   (
         SELECT EMPNO,
                COUNT( status ) AS "Present Days"
         FROM   attendance
         WHERE  EMPNO = 'EMP00254'
         AND    status = 'P'
         GROUP BY EMPNO
       ) a
       RIGHT OUTER JOIN EMP_OFFICIAL k
       ON ( k.EMPNO = a.EMPNO )
WHERE  k.EMPNO = 'EMP00254';

或者您可以使用 UNION ALL 查询两个 table 并将结果分为两行(而不是两列):

SELECT 'Present Days' As type,
       COUNT(status)  AS Days
FROM   attendance
WHERE  empno = 'EMP00254' 
WHERE  status = 'P'
UNION ALL
SELECT 'Total Days',
       TRUNC( SYSDATE ) - TRUNC( joining_date )
FROM   EMP_OFFICIAL
WHERE  empno = 'EMP00254';