SQL 如何在遍历列时取出数据?
SQL how to take out data while looping through columns?
我的 SQL 代码还有另一个问题。下面我将通过展示我的 table 之一以及我想如何从中获取信息来告诉您。
1) 公司的所有员工都属于一个部门。在这个table中,例如,员工00010-00013到Dept1和00019-00022到Dept4。
2) 发薪时,table作为员工状态栏"Paid"或"Unpaid"是否已发薪的记录。可以看到,除了00017和00022以外的所有员工都已经拿到了工资。
3) 当属于某个部门的所有员工都已支付时,部门状态应更改为"Paid",表示属于该部门的所有员工都已支付。如您所见,Dept1 的所有员工都已收到工资,部门状态设置为 "Paid"。 Dept4 的所有员工都没有被支付,Department Status 设置为 "Unpaid".
4) 可以看到,在Dept2 的Department Status 中做了一个"error"。尽管所有员工都已支付,但部门状态仍设置为 "Unpaid"。
我需要构建一个代码来显示像 Dept2 这样的所有部门,这些部门的所有员工都已领薪水,但仍未更改其状态。
这可以通过省略所有其他(正确的)部门,或者添加一个新的列来完成,其中注明了这一点,以便我可以在之后进行排序。下面我将添加一些无用的伪代码,通过添加一个新列 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"
我认为你把这种方式搞得太复杂了。要确定标记为未付薪且员工标记为已付薪的部门:
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
SELECT
*
FROM PAYTABLE A
WHERE DEPART NOT IN (
SELECT
DEPART
FROM PAYTABLE A
WHERE EMPLOY_STAT='Unpaid'
)
AND DEPART_STAT='Unpaid'
我认为您需要使用以下查询
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'
我的 SQL 代码还有另一个问题。下面我将通过展示我的 table 之一以及我想如何从中获取信息来告诉您。
1) 公司的所有员工都属于一个部门。在这个table中,例如,员工00010-00013到Dept1和00019-00022到Dept4。
2) 发薪时,table作为员工状态栏"Paid"或"Unpaid"是否已发薪的记录。可以看到,除了00017和00022以外的所有员工都已经拿到了工资。
3) 当属于某个部门的所有员工都已支付时,部门状态应更改为"Paid",表示属于该部门的所有员工都已支付。如您所见,Dept1 的所有员工都已收到工资,部门状态设置为 "Paid"。 Dept4 的所有员工都没有被支付,Department Status 设置为 "Unpaid".
4) 可以看到,在Dept2 的Department Status 中做了一个"error"。尽管所有员工都已支付,但部门状态仍设置为 "Unpaid"。
我需要构建一个代码来显示像 Dept2 这样的所有部门,这些部门的所有员工都已领薪水,但仍未更改其状态。
这可以通过省略所有其他(正确的)部门,或者添加一个新的列来完成,其中注明了这一点,以便我可以在之后进行排序。下面我将添加一些无用的伪代码,通过添加一个新列 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"
我认为你把这种方式搞得太复杂了。要确定标记为未付薪且员工标记为已付薪的部门:
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
SELECT
*
FROM PAYTABLE A
WHERE DEPART NOT IN (
SELECT
DEPART
FROM PAYTABLE A
WHERE EMPLOY_STAT='Unpaid'
)
AND DEPART_STAT='Unpaid'
我认为您需要使用以下查询
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'