日期差异和ORA-00937 - 不是单组组功能

时间:2018-01-10 07:47:39

标签: sql oracle oracle10g

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

这是我迄今为止所尝试过的:

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的情况下获得这些日子吗?

3 个答案:

答案 0 :(得分:2)

首先,该子查询很可能不是标量(看起来你假设多行可以来自考勤表),其次,它包含一个不必要的联接......

我会做的是:

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'是一个独特的专栏。

答案 1 :(得分:2)

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

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查询两个表,并将结果分为两行(而不是两列):

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';

答案 2 :(得分:1)

删除COUNT(status) AS "Present Days"部分和SELECT内部的paranthesis:

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';

OR

使用以下内容(在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 )等内联选择语句中使用对偶,只需( TRUNC(TO_DATE('01/10/2018', 'MM/DD/YYYY') - TO_DATE(k.JOINING_DATE, 'MM/DD/YYYY'))即可。