Sql 日期差异和ORA-00937-非单个组功能

Sql 日期差异和ORA-00937-非单个组功能,sql,oracle,oracle10g,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

我正在尝试添加两个表,并从两个日期获取总天数。但是有一个简单的问题:没有一个单一的组功能

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

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的情况下获取天数?

删除COUNTstatus作为当前天数部分,然后选择inside:

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末尾使用以下“添加分组依据”表达式:

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'));
因为,分组项目和非分组项目不能一起使用

顺便说一下,您不需要在您的内联select语句中使用dual,例如select TRUNCTO_DATE'01/10/2018',MM/DD/YYYY'-to_-DATEk.join_-DATE,'MM/DD/YYYY'-to_-DATEk.join_-DATE,'MM/DD/YYYYYY'-to-to-to-to-DATEk.join_-DATE,“MM/DD/YYYY”就足够了。

删除COUNTstatus作为“当前日期”部分,然后选择:

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末尾使用以下“添加分组依据”表达式:

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'));
因为,分组项目和非分组项目不能一起使用


顺便说一句,你不需要在你的内联select语句中使用dual,比如select TRUNCTO DATE'01/10/2018',MM/DD/YYYY'-to-DATEk。从dual开始加入日期'MM/DD/YYYY',只要TRUNCTO DATE'01/10/2018',MM/DD/YYYY'-to-DATEk。加入日期'MM/DD/YYYYYY'就足够了。

首先,该子查询很可能不是标量查询—看起来您假设考勤表中可以有多行,其次,它包含不必要的联接

我要做的是:

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列是日期数据类型,并且“k.empno”是唯一的列。

首先,子查询很可能不是标量的。看起来您假设考勤表中可以有多行,其次,它包含不必要的联接

我要做的是:

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.Enjoining_date列为日期数据类型,“k.empno”是唯一的列。

如果每个员工的EMP_官方表格中只有一行,则您可以执行以下操作:

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

如果每个员工在EMP_官方表格中只有一行,则您可以执行以下操作:

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';
不相关,但是:对to_date调用的结果使用trunc是无用的。截至2018年10月1日,“MM/DD/YYYY”的时间部分已设置为00:00:00。另一方面,在已经是日期的列上调用_date完全是胡说八道。不要这样做。如何添加两个表?这到底是什么意思?不,不要回答,不要当小丑,你知道我的意思-我真的不知道你的意思。不相关,但是:在一个约会电话的结果上使用trunc是没有用的。截至2018年10月1日,“MM/DD/YYYY”的时间部分已设置为00:00:00。另一方面,在已经是日期的列上调用_date完全是胡说八道。不要这样做。如何添加两个表?这到底是什么意思?不,不要回答,不要当小丑,你知道我的意思-我真的不知道你的意思。