如果满足某些条件,则从select语句中排除行

时间:2015-07-29 22:54:32

标签: sql sql-server tsql

我在一个表中有一个ID列,其中包含员工ID字符串以及一个包含员工终止日期的列。如果员工仍处于活动状态,则为空值。

这里的问题是员工ID可以采用两种格式。如果员工在公司的多个职位上填写,那么他们的员工ID字符串的最后一个索引上会有一个字母。实施例。

05214

05214A

如果与上述ID之一相关联的终止日期中至少有一个为空,那么我想将其从选择中排除,因为这意味着它们在至少一个位置仍处于活动状态。

这是我现在没有添加功能的语句的布局。

SELECT DISTINCT p.[hr_pe_id] AS ID,
                i.[SSN] AS SSN, 
                p.[emp_f_name] AS fname, 
                p.[emp_l_name] AS lname, 
                p.[term_dt] AS termdate
FROM [dbo].[InsurancePremiums] i 
INNER JOIN [production_finance].[dbo].[hr_pe_mstr] p
ON (i.[SSN] = p.[hr_pe_ssn])
WHERE(p.[term_dt] IS NOT NULL)

2 个答案:

答案 0 :(得分:1)

我认为这就是你想要的。注意" _" character是任何单个字符匹配的sql通配符。

SELECT DISTINCT
  p.[hr_pe_id] AS ID,
  i.[SSN] AS SSN,
  p.[emp_f_name] AS fname,
  p.[emp_l_name] AS lname,
  p.[term_dt] AS termdate
FROM
  [dbo].[InsurancePremiums] i
  INNER JOIN [production_finance].[dbo].[hr_pe_mstr] p
    ON ( i.[SSN] = p.[hr_pe_ssn] )
WHERE
  ( p.[term_dt] IS NOT NULL )
  AND NOT EXISTS ( 
                   SELECT
                    *
                   FROM
                    [production_finance].[dbo].[hr_pe_mstr] p2
                   WHERE
                    p.[hr_pe_id] LIKE p2.[hr_pe_id] + '_'
                    AND p2.[term_dt] IS NOT NULL 
                 )

答案 1 :(得分:0)

此语法将识别具有至少一个非终止职位的员工:

select case when ISNUMERIC(hr_pe_id) = 1 
    then hr_pe_id
    else left(hr_pe_id, 5) end as EmployeeIDTrimmed
, max(case when Term_Dt is null then 'Y' else 'N' end) as StillEmployed
from MyTable
group by case when ISNUMERIC(hr_pe_id) = 1 
    then hr_pe_id
    else left(hr_pe_id, 5) end