SQL如何在循环遍历列时取出数据?

时间:2015-06-02 14:13:12

标签: sql sql-server loops calculated-columns

我的SQL代码有另一个问题。下面我将通过展示我的一张表以及我如何从中获取信息来告诉你。

http://i.stack.imgur.com/FqWs6.jpg

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"

3 个答案:

答案 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'