sql O如何在oracle中实现以下功能而不创建存储过程?使用
ı如何使用employees表获得此结果?对于工资sql O如何在oracle中实现以下功能而不创建存储过程?使用,sql,oracle,oracle11g,average,Sql,Oracle,Oracle11g,Average,ı如何使用employees表获得此结果?对于工资1 employee_id salary a 1 b 1 c 0 d 0 e 0 f 1 您可以按平均工资交叉加入: SELECT employee_id, CASE WHEN salary > avg_salary THEN 1 ELS
employee_id salary
a 1
b 1
c 0
d 0
e 0
f 1
您可以按平均工资交叉加入:
SELECT employee_id,
CASE WHEN salary > avg_salary THEN 1 ELSE 0 END AS salary
FROM employee
CROSS JOIN (SELECT AVG(salary)
FROM employee)
您可以按平均工资交叉加入:
SELECT employee_id,
CASE WHEN salary > avg_salary THEN 1 ELSE 0 END AS salary
FROM employee
CROSS JOIN (SELECT AVG(salary)
FROM employee)
您可以简单地计算工资的平均值,并将其与案例中每个员工的工资进行比较 比如说,
SQL> SELECT empno,
2 ename,
3 CASE
4 WHEN sal >
5 (SELECT AVG(sal) FROM emp
6 )
7 THEN 1
8 ELSE 0
9 END flag
10 FROM emp;
EMPNO ENAME FLAG
---------- ---------- ----------
7369 SMITH 0
7499 ALLEN 0
7521 WARD 0
7566 JONES 1
7654 MARTIN 0
7698 BLAKE 1
7782 CLARK 1
7788 SCOTT 1
7839 KING 1
7844 TURNER 0
7876 ADAMS 0
7900 JAMES 0
7902 FORD 1
7934 MILLER 0
14 rows selected.
SQL>
SQL> SELECT empno,
2 ename,
3 CASE
4 WHEN sal > avg(sal) OVER(ORDER BY NULL) THEN
5 1
6 ELSE
7 0
8 END flag
9 FROM emp;
EMPNO ENAME FLAG
---------- ---------- ----------
7369 SMITH 0
7499 ALLEN 0
7521 WARD 0
7566 JONES 1
7654 MARTIN 0
7698 BLAKE 1
7782 CLARK 1
7788 SCOTT 1
7839 KING 1
7844 TURNER 0
7876 ADAMS 0
7900 JAMES 0
7902 FORD 1
7934 MILLER 0
14 rows selected.
SQL>
替代解决方案您可以使用AVG()分析函数
比如说,
SQL> SELECT empno,
2 ename,
3 CASE
4 WHEN sal >
5 (SELECT AVG(sal) FROM emp
6 )
7 THEN 1
8 ELSE 0
9 END flag
10 FROM emp;
EMPNO ENAME FLAG
---------- ---------- ----------
7369 SMITH 0
7499 ALLEN 0
7521 WARD 0
7566 JONES 1
7654 MARTIN 0
7698 BLAKE 1
7782 CLARK 1
7788 SCOTT 1
7839 KING 1
7844 TURNER 0
7876 ADAMS 0
7900 JAMES 0
7902 FORD 1
7934 MILLER 0
14 rows selected.
SQL>
SQL> SELECT empno,
2 ename,
3 CASE
4 WHEN sal > avg(sal) OVER(ORDER BY NULL) THEN
5 1
6 ELSE
7 0
8 END flag
9 FROM emp;
EMPNO ENAME FLAG
---------- ---------- ----------
7369 SMITH 0
7499 ALLEN 0
7521 WARD 0
7566 JONES 1
7654 MARTIN 0
7698 BLAKE 1
7782 CLARK 1
7788 SCOTT 1
7839 KING 1
7844 TURNER 0
7876 ADAMS 0
7900 JAMES 0
7902 FORD 1
7934 MILLER 0
14 rows selected.
SQL>
您可以简单地计算工资的平均值,并将其与案例中每个员工的工资进行比较 比如说,
SQL> SELECT empno,
2 ename,
3 CASE
4 WHEN sal >
5 (SELECT AVG(sal) FROM emp
6 )
7 THEN 1
8 ELSE 0
9 END flag
10 FROM emp;
EMPNO ENAME FLAG
---------- ---------- ----------
7369 SMITH 0
7499 ALLEN 0
7521 WARD 0
7566 JONES 1
7654 MARTIN 0
7698 BLAKE 1
7782 CLARK 1
7788 SCOTT 1
7839 KING 1
7844 TURNER 0
7876 ADAMS 0
7900 JAMES 0
7902 FORD 1
7934 MILLER 0
14 rows selected.
SQL>
SQL> SELECT empno,
2 ename,
3 CASE
4 WHEN sal > avg(sal) OVER(ORDER BY NULL) THEN
5 1
6 ELSE
7 0
8 END flag
9 FROM emp;
EMPNO ENAME FLAG
---------- ---------- ----------
7369 SMITH 0
7499 ALLEN 0
7521 WARD 0
7566 JONES 1
7654 MARTIN 0
7698 BLAKE 1
7782 CLARK 1
7788 SCOTT 1
7839 KING 1
7844 TURNER 0
7876 ADAMS 0
7900 JAMES 0
7902 FORD 1
7934 MILLER 0
14 rows selected.
SQL>
替代解决方案您可以使用AVG()分析函数
比如说,
SQL> SELECT empno,
2 ename,
3 CASE
4 WHEN sal >
5 (SELECT AVG(sal) FROM emp
6 )
7 THEN 1
8 ELSE 0
9 END flag
10 FROM emp;
EMPNO ENAME FLAG
---------- ---------- ----------
7369 SMITH 0
7499 ALLEN 0
7521 WARD 0
7566 JONES 1
7654 MARTIN 0
7698 BLAKE 1
7782 CLARK 1
7788 SCOTT 1
7839 KING 1
7844 TURNER 0
7876 ADAMS 0
7900 JAMES 0
7902 FORD 1
7934 MILLER 0
14 rows selected.
SQL>
SQL> SELECT empno,
2 ename,
3 CASE
4 WHEN sal > avg(sal) OVER(ORDER BY NULL) THEN
5 1
6 ELSE
7 0
8 END flag
9 FROM emp;
EMPNO ENAME FLAG
---------- ---------- ----------
7369 SMITH 0
7499 ALLEN 0
7521 WARD 0
7566 JONES 1
7654 MARTIN 0
7698 BLAKE 1
7782 CLARK 1
7788 SCOTT 1
7839 KING 1
7844 TURNER 0
7876 ADAMS 0
7900 JAMES 0
7902 FORD 1
7934 MILLER 0
14 rows selected.
SQL>
这在语法上是不正确的。用于交叉联接的查询缺少
分组依据
,但在任何情况下都不能使用分组依据。您只需要所有员工的平均工资。@LalitKumarB实际上,您不需要group by,也不需要join子句——这是交叉联接。当然,你是对的——这个查询在语法上是不正确的。编辑并修复。这在语法上是不正确的。用于交叉联接的查询缺少分组依据
,但在任何情况下都不能使用分组依据。您只需要所有员工的平均工资。@LalitKumarB实际上,您不需要group by,也不需要join子句——这是交叉联接。当然,你是对的——这个查询在语法上是不正确的。编辑和固定。