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完全是胡说八道。不要这样做。如何添加两个表?这到底是什么意思?不,不要回答,不要当小丑,你知道我的意思-我真的不知道你的意思。