我的SQL代码有另一个问题。下面我将通过展示我的一张表以及我如何从中获取信息来告诉你。
1)公司的所有员工都属于某个部门。在此表中,例如,员工00010-00013到Dept1和00019-00022到Dept4。
2)在付款时,该表用作记录员工身份列中是否已支付员工的状态为“付费”或“未付款”。如您所见,除了00017和00022之外的所有员工都已获得报酬。
3)当属于某个部门的所有员工都已获得报酬时,部门状态应更改为“付费”,这意味着属于该部门的所有员工都已获得报酬。如您所见,Dept1的所有员工都已获得报酬,而且部门状态设置为“付费”。部门4的所有员工都没有获得报酬,部门状态设置为“未付”。
4)如您所见,Dept2的部门状态出现“错误”。尽管所有员工都已获得报酬,但部门状态仍设为“未付”。
我需要构建一个代码,它可以显示Dept2等所有已支付所有Employees但仍未更改其状态的部门。
这可以通过省略所有其他(正确的)部门,或者添加一个新的列来记录,这样我就可以进行排序。下面我将添加一个无用的伪代码,通过添加一个新的列INCOR_DEP_STAT来显示我想要实现的内容,我在其中告知部门状态是否不正确。
SELECT A.DEPART, A.DEPART_STAT, A.EMPLOY, A.EMPLOY_STAT, 'N/A' as INCOR_DEP_STAT
FROM PAYTABLE A
FOR all objects in A.DEPART;
IF all A.EMPLOY_STAT in A.DEPART == "Paid" AND IF A.DEPART_STAT == "Unpaid"
THEN INCOR_DEPT_STAT = "Incorrect"
答案 0 :(得分:0)
我认为你这样做太复杂了。识别标记为已付款的员工标记为已付款的部门:
select
distinct department
from
PayTable
where
depart_stat= 'Unpaid'
and employ_stat= 'Paid'
如果您想派生一个列来显示:
select
...,
case when depart_stat= 'Unpaid' and employ_stat = 'Paid' then 'Incorrect'
else 'Correct' end as Incor_Dept_Stat
from
PayTable
编辑: 重新阅读你的问题。如果您只想要部门状态不等于该组中所有员工的员工状态的部门:
select
dept,
dept_status
from
(
select
dept,
dept_status,
count (employee) as Emps,
count (case when Employ_Status <> Dept_Status then 1 else null end) as PaidStatus
from
PayTable
group by
dept,
dept_status
) t
where
emps = PaidStatus
答案 1 :(得分:0)
SELECT
*
FROM PAYTABLE A
WHERE DEPART NOT IN (
SELECT
DEPART
FROM PAYTABLE A
WHERE EMPLOY_STAT='Unpaid'
)
AND DEPART_STAT='Unpaid'
答案 2 :(得分:0)
我认为您需要使用以下查询
SELECT DISTINCT A.DEPART_STAT
, A.EMPLOY
, A.EMPLOY_STAT
, 'N/A' as INCOR_DEP_STAT
FROM PAYTABLE A
WHERE 'Paid' = ALL
(SELECT p1.Status
FROM PAYTABLE p1
WHERE A.Department = P1.Department)
AND A.Status = 'UnPaid'