Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 显示员工姓名、休假、合格休假和百分比的查询_Sql_Oracle_Oracle11g - Fatal编程技术网

Sql 显示员工姓名、休假、合格休假和百分比的查询

Sql 显示员工姓名、休假、合格休假和百分比的查询,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有以下列的表格: Employee24( EMPLOYEEID, FIRSTNAME, LASTNAME, GENDER, JOBROLES); Leave25( EMPLOYEEID,LEAVEID, LEAVETYPE, STARTDATE, ENDDATE); JOBROLESELIGIBLELE(JOBROLES, ELIGIBLE_SICK_LEAVES, ELIGIBLE_EARNED_LEAVES) 我想写一个查询来显示员工姓名、休假、符合条件的休假和百分比

我有以下列的表格:

   Employee24( EMPLOYEEID, FIRSTNAME, LASTNAME, GENDER, JOBROLES);

   Leave25( EMPLOYEEID,LEAVEID, LEAVETYPE, STARTDATE, ENDDATE);

  JOBROLESELIGIBLELE(JOBROLES, ELIGIBLE_SICK_LEAVES, ELIGIBLE_EARNED_LEAVES)
我想写一个查询来显示员工姓名、休假、符合条件的休假和百分比

        SELECT * 
  FROM EMPLOYEE24 
  WHERE EMPLOYEEID IN (SELECT EMPLOYEEID 
                        FROM LEAVE25 L WHERE (STARTDATE-ENDDATE) AS "TAKENLEAVE"
    < (SELECT (ELIGIBLE_SICK_LEAVES + ELIGIBLE_EARNED_LEAVES) AS "ELIGIBLELEAVE"
              ,TAKENLEAVE/ELIGIBLELEAVE * 100
              FROM  JOBROLESELIGIBELE));
预期结果:
EMPLOYEEID | FIRSTNAME | LASTNAME | levestaken | ELIGIBLELEAVES |百分比

不能在列列表中使用别名来表示列,必须使用完整表达式。并且不能在
WHERE
子句中的列上引入别名

也许你想要这样的东西:

SELECT E.FIRSTNAME,
       E.LASTNAME,
       (SELECT SUM(L.STARTDATE - L.ENDDATE)
               FROM LEAVE25 L
               WHERE L.EMPLOYEEID = E.EMPLOYEEEID) "TAKENLEAVE",
       J.ELIGIBLE_SICK_LEAVES + J.ELIGIBLE_EARNED_LEAVES "ELIGIBLELEAVE",
       (SELECT SUM(L.STARTDATE - L.ENDDATE)
               FROM LEAVE25 L
               WHERE L.EMPLOYEEID = E.EMPLOYEEEID)
       /
       (J.ELIGIBLE_SICK_LEAVES + J.ELIGIBLE_EARNED_LEAVES)
       * 100 "PERCENTAGE"
       FROM EMPLOYEE24 E
            LEFT JOIN JOBROLESELIGIBLELE J
                      ON J.JOBROLES = E.JOBROLES;
这是我的一个小小的改变:

Oracle 11g R2架构设置

CREATE TABLE Employee24( EMPLOYEEID, JOBROLES ) AS
SELECT 1, 'RoleA' FROM DUAL UNION ALL
SELECT 2, 'RoleB' FROM DUAL UNION ALL
SELECT 3, 'RoleB' FROM DUAL UNION ALL
SELECT 4, 'RoleA' FROM DUAL UNION ALL
SELECT 5, 'RoleB' FROM DUAL;

CREATE TABLE Leave25( EMPLOYEEID,LEAVEID, LEAVETYPE, STARTDATE, ENDDATE) AS
SELECT 1,1,'SickLeave',  DATE '2018-01-01', DATE '2018-01-11' FROM DUAL UNION ALL
SELECT 1,2,'SickLeave',  DATE '2018-01-21', DATE '2018-01-31' FROM DUAL UNION ALL
SELECT 1,3,'EarnedLeave',DATE '2018-01-11', DATE '2018-01-21' FROM DUAL UNION ALL
SELECT 1,4,'EarnedLeave',DATE '2018-02-01', DATE '2018-02-11' FROM DUAL UNION ALL
SELECT 1,5,'EarnedLeave',DATE '2018-02-21', DATE '2018-03-03' FROM DUAL UNION ALL
SELECT 2,6,'EarnedLeave',DATE '2018-02-01', DATE '2018-02-13' FROM DUAL UNION ALL
SELECT 3,7,'SickLeave',  DATE '2018-01-01', DATE '2018-01-09' FROM DUAL UNION ALL
SELECT 5,8,'EarnedLeave',DATE '2018-02-01', DATE '2018-02-11' FROM DUAL;


CREATE TABLE JOBROLESELIGIBLELE(JOBROLES, ELIGIBLE_SICK_LEAVES, ELIGIBLE_EARNED_LEAVES) AS
SELECT 'RoleA', 14, 24 FROM DUAL UNION ALL
SELECT 'RoleB',  7, 10 FROM DUAL;
SELECT e.employeeId,
       r.leavetype,
       COALESCE( l.days_leave, 0 ) AS days_leave,
       r.AllowedLeaveAmount,
       100 * COALESCE( l.days_leave, 0 ) / r.AllowedLeaveAmount As leave_percent 
FROM   Employee24 e
       INNER JOIN
       ( SELECT *
         FROM   JobRolesEligibleLE
         UNPIVOT ( AllowedLeaveAmount FOR LeaveType IN (
           Eligible_Sick_Leaves   AS 'SickLeave',
           Eligible_Earned_Leaves AS 'EarnedLeave'
         ) )
       ) r
       ON ( e.jobroles   = r.jobroles )
       LEFT OUTER JOIN
       ( SELECT employeeId,
                SUM( enddate - startdate ) AS days_leave,
                leavetype
         FROM   Leave25
         GROUP BY employeeId, leaveType
       ) l
       ON (   e.employeeId = l.employeeId
          AND l.leavetype = r.leavetype )
ORDER BY employeeId, LeaveType
| EMPLOYEEID |   LEAVETYPE | DAYS_LEAVE | ALLOWEDLEAVEAMOUNT |      LEAVE_PERCENT |
|------------|-------------|------------|--------------------|--------------------|
|          1 | EarnedLeave |         30 |                 24 |                125 |
|          1 |   SickLeave |         20 |                 14 | 142.85714285714286 |
|          2 | EarnedLeave |         12 |                 10 |                120 |
|          2 |   SickLeave |          0 |                  7 |                  0 |
|          3 | EarnedLeave |          0 |                 10 |                  0 |
|          3 |   SickLeave |          8 |                  7 | 114.28571428571429 |
|          4 | EarnedLeave |          0 |                 24 |                  0 |
|          4 |   SickLeave |          0 |                 14 |                  0 |
|          5 | EarnedLeave |         10 |                 10 |                100 |
|          5 |   SickLeave |          0 |                  7 |                  0 |
查询1

CREATE TABLE Employee24( EMPLOYEEID, JOBROLES ) AS
SELECT 1, 'RoleA' FROM DUAL UNION ALL
SELECT 2, 'RoleB' FROM DUAL UNION ALL
SELECT 3, 'RoleB' FROM DUAL UNION ALL
SELECT 4, 'RoleA' FROM DUAL UNION ALL
SELECT 5, 'RoleB' FROM DUAL;

CREATE TABLE Leave25( EMPLOYEEID,LEAVEID, LEAVETYPE, STARTDATE, ENDDATE) AS
SELECT 1,1,'SickLeave',  DATE '2018-01-01', DATE '2018-01-11' FROM DUAL UNION ALL
SELECT 1,2,'SickLeave',  DATE '2018-01-21', DATE '2018-01-31' FROM DUAL UNION ALL
SELECT 1,3,'EarnedLeave',DATE '2018-01-11', DATE '2018-01-21' FROM DUAL UNION ALL
SELECT 1,4,'EarnedLeave',DATE '2018-02-01', DATE '2018-02-11' FROM DUAL UNION ALL
SELECT 1,5,'EarnedLeave',DATE '2018-02-21', DATE '2018-03-03' FROM DUAL UNION ALL
SELECT 2,6,'EarnedLeave',DATE '2018-02-01', DATE '2018-02-13' FROM DUAL UNION ALL
SELECT 3,7,'SickLeave',  DATE '2018-01-01', DATE '2018-01-09' FROM DUAL UNION ALL
SELECT 5,8,'EarnedLeave',DATE '2018-02-01', DATE '2018-02-11' FROM DUAL;


CREATE TABLE JOBROLESELIGIBLELE(JOBROLES, ELIGIBLE_SICK_LEAVES, ELIGIBLE_EARNED_LEAVES) AS
SELECT 'RoleA', 14, 24 FROM DUAL UNION ALL
SELECT 'RoleB',  7, 10 FROM DUAL;
SELECT e.employeeId,
       r.leavetype,
       COALESCE( l.days_leave, 0 ) AS days_leave,
       r.AllowedLeaveAmount,
       100 * COALESCE( l.days_leave, 0 ) / r.AllowedLeaveAmount As leave_percent 
FROM   Employee24 e
       INNER JOIN
       ( SELECT *
         FROM   JobRolesEligibleLE
         UNPIVOT ( AllowedLeaveAmount FOR LeaveType IN (
           Eligible_Sick_Leaves   AS 'SickLeave',
           Eligible_Earned_Leaves AS 'EarnedLeave'
         ) )
       ) r
       ON ( e.jobroles   = r.jobroles )
       LEFT OUTER JOIN
       ( SELECT employeeId,
                SUM( enddate - startdate ) AS days_leave,
                leavetype
         FROM   Leave25
         GROUP BY employeeId, leaveType
       ) l
       ON (   e.employeeId = l.employeeId
          AND l.leavetype = r.leavetype )
ORDER BY employeeId, LeaveType
| EMPLOYEEID |   LEAVETYPE | DAYS_LEAVE | ALLOWEDLEAVEAMOUNT |      LEAVE_PERCENT |
|------------|-------------|------------|--------------------|--------------------|
|          1 | EarnedLeave |         30 |                 24 |                125 |
|          1 |   SickLeave |         20 |                 14 | 142.85714285714286 |
|          2 | EarnedLeave |         12 |                 10 |                120 |
|          2 |   SickLeave |          0 |                  7 |                  0 |
|          3 | EarnedLeave |          0 |                 10 |                  0 |
|          3 |   SickLeave |          8 |                  7 | 114.28571428571429 |
|          4 | EarnedLeave |          0 |                 24 |                  0 |
|          4 |   SickLeave |          0 |                 14 |                  0 |
|          5 | EarnedLeave |         10 |                 10 |                100 |
|          5 |   SickLeave |          0 |                  7 |                  0 |

CREATE TABLE Employee24( EMPLOYEEID, JOBROLES ) AS
SELECT 1, 'RoleA' FROM DUAL UNION ALL
SELECT 2, 'RoleB' FROM DUAL UNION ALL
SELECT 3, 'RoleB' FROM DUAL UNION ALL
SELECT 4, 'RoleA' FROM DUAL UNION ALL
SELECT 5, 'RoleB' FROM DUAL;

CREATE TABLE Leave25( EMPLOYEEID,LEAVEID, LEAVETYPE, STARTDATE, ENDDATE) AS
SELECT 1,1,'SickLeave',  DATE '2018-01-01', DATE '2018-01-11' FROM DUAL UNION ALL
SELECT 1,2,'SickLeave',  DATE '2018-01-21', DATE '2018-01-31' FROM DUAL UNION ALL
SELECT 1,3,'EarnedLeave',DATE '2018-01-11', DATE '2018-01-21' FROM DUAL UNION ALL
SELECT 1,4,'EarnedLeave',DATE '2018-02-01', DATE '2018-02-11' FROM DUAL UNION ALL
SELECT 1,5,'EarnedLeave',DATE '2018-02-21', DATE '2018-03-03' FROM DUAL UNION ALL
SELECT 2,6,'EarnedLeave',DATE '2018-02-01', DATE '2018-02-13' FROM DUAL UNION ALL
SELECT 3,7,'SickLeave',  DATE '2018-01-01', DATE '2018-01-09' FROM DUAL UNION ALL
SELECT 5,8,'EarnedLeave',DATE '2018-02-01', DATE '2018-02-11' FROM DUAL;


CREATE TABLE JOBROLESELIGIBLELE(JOBROLES, ELIGIBLE_SICK_LEAVES, ELIGIBLE_EARNED_LEAVES) AS
SELECT 'RoleA', 14, 24 FROM DUAL UNION ALL
SELECT 'RoleB',  7, 10 FROM DUAL;
SELECT e.employeeId,
       r.leavetype,
       COALESCE( l.days_leave, 0 ) AS days_leave,
       r.AllowedLeaveAmount,
       100 * COALESCE( l.days_leave, 0 ) / r.AllowedLeaveAmount As leave_percent 
FROM   Employee24 e
       INNER JOIN
       ( SELECT *
         FROM   JobRolesEligibleLE
         UNPIVOT ( AllowedLeaveAmount FOR LeaveType IN (
           Eligible_Sick_Leaves   AS 'SickLeave',
           Eligible_Earned_Leaves AS 'EarnedLeave'
         ) )
       ) r
       ON ( e.jobroles   = r.jobroles )
       LEFT OUTER JOIN
       ( SELECT employeeId,
                SUM( enddate - startdate ) AS days_leave,
                leavetype
         FROM   Leave25
         GROUP BY employeeId, leaveType
       ) l
       ON (   e.employeeId = l.employeeId
          AND l.leavetype = r.leavetype )
ORDER BY employeeId, LeaveType
| EMPLOYEEID |   LEAVETYPE | DAYS_LEAVE | ALLOWEDLEAVEAMOUNT |      LEAVE_PERCENT |
|------------|-------------|------------|--------------------|--------------------|
|          1 | EarnedLeave |         30 |                 24 |                125 |
|          1 |   SickLeave |         20 |                 14 | 142.85714285714286 |
|          2 | EarnedLeave |         12 |                 10 |                120 |
|          2 |   SickLeave |          0 |                  7 |                  0 |
|          3 | EarnedLeave |          0 |                 10 |                  0 |
|          3 |   SickLeave |          8 |                  7 | 114.28571428571429 |
|          4 | EarnedLeave |          0 |                 24 |                  0 |
|          4 |   SickLeave |          0 |                 14 |                  0 |
|          5 | EarnedLeave |         10 |                 10 |                100 |
|          5 |   SickLeave |          0 |                  7 |                  0 |

示例数据和期望的结果将有助于传达您想要做的事情。@GordonLinoff添加了示例数据和期望的结果。感谢您,daysleave列和percentage列中的每条记录都会显示出来zero@user2147357请提供一个例子来说明这个问题,因为SQLFIDLE清楚地表明,对于我的数据,这些列并不都是零。