【问题标题】:Duplicate values and extra rows重复值和额外行
【发布时间】:2020-01-17 02:17:02
【问题描述】:

我目前有以下查询,结果位于底部。

select 
           b.EMPLOYEE,
           FIRST_NAME,
                       LAST_NAME,
                       PL_1,
                       PL_2,
                       PL_3,
                       PL_4,
                       PL_5,
                       PL_6,
                       DUAL_EMPLOYEE,
                       Dual_Process_Level_Comparison,
           case when b.Primary_Compare_Number <> b.Supplemental_Compare_Number then 'REVIEW' else 'MATCH' end as process_level_compare
    FROM
    (
    select 
      a.EMPLOYEE, 
      m.FIRST_NAME, 
      m.LAST_NAME, 
      m.PROCESS_LEVEL as PL_1, 
      max(case when a.POS_LEVEL = 2 then a.PROCESS_LEVEL end) as PL_2, 
      max(case when a.POS_LEVEL = 3 then a.PROCESS_LEVEL end) as PL_3, 
      max(case when a.POS_LEVEL = 4 then a.PROCESS_LEVEL end) as PL_4, 
      max(case when a.POS_LEVEL = 5 then a.PROCESS_LEVEL end) as PL_5, 
      max(case when a.POS_LEVEL = 6 then a.PROCESS_LEVEL end) as PL_6, 
      case when s.[DUAL EMPLOYEE] = 'UNASSIGNED' then ' ' else s.[DUAL EMPLOYEE] end as DUAL_EMPLOYEE, 
      case when m.PROCESS_LEVEL = s.[DUAL EMPLOYEE] then 'REVIEW' end as Dual_Process_Level_Comparison, 
      case 
        when m.PROCESS_LEVEL in ('CALL') then 1 
        when m.PROCESS_LEVEL in ('ECCHS', 'HCCHS') then 2 
           when m.PROCESS_LEVEL in ('ESCH', 'HCLER', 'HSCH') then 3 
           when m.PROCESS_LEVEL in ('LPBNO', 'LSBCR', 'LSBCW', 'LTBC','LTBH', 'LTBV', 'LTCLR', 'LTCS', 'LTHC','LTMON', 'LTSBC') then 4 
           when m.PROCESS_LEVEL in ('MELRO') then 5 
           when m.PROCESS_LEVEL in ('PLONG') then 6 
           when m.PROCESS_LEVEL in ('PNSVL') then 7 
           when m.PROCESS_LEVEL in ('SAUK') then 8 
           when m.PROCESS_LEVEL in ('TMONT') then 9 
           when m.PROCESS_LEVEL in ('WACM') then 10 
           when m.PROCESS_LEVEL in ('WCRS', 'WFPMC', 'WRDWF') then 11 
      end as Primary_Compare_Number,   

      case 
        when a.PROCESS_LEVEL in ('CALL') then 1 
        when a.PROCESS_LEVEL in ('ECCHS', 'HCCHS') then 2 
           when a.PROCESS_LEVEL in ('ESCH', 'HCLER', 'HSCH') then 3 
           when a.PROCESS_LEVEL in ('LPBNO', 'LSBCR', 'LSBCW', 'LTBC', 'LTBH', 'LTBV', 'LTCLR', 'LTCS', 'LTHC', 'LTMON', 'LTSBC') then 4 
           when a.PROCESS_LEVEL in ('MELRO') then 5 
           when a.PROCESS_LEVEL in ('PLONG') then 6 
           when a.PROCESS_LEVEL in ('PNSVL') then 7 
           when a.PROCESS_LEVEL in ('SAUK') then 8 
           when a.PROCESS_LEVEL in ('TMONT') then 9 
           when a.PROCESS_LEVEL in ('WACM') then 10 
           when a.PROCESS_LEVEL in ('WCRS', 'WFPMC', 'WRDWF') then 11 
      end as Supplemental_Compare_Number
    from 
      dbo.vw_PAEMPPOS a 
      join dbo.COMPLETE_EMPLOYEE_MASTER m on m.EMPLOYEE = a.EMPLOYEE 
      join dbo.HR_EMPUSERFIELDS s on s.EMPLOYEE = m.EMPLOYEE 


    where END_DATE = '2099-12-31 00:00:00.000' 
      and EMP_STATUS NOT IN ('1A', 'RT', 'SZ', 'T1', 'XD', 'XV', 'ZZ') 
    group by 
      a.EMPLOYEE, 
      m.LAST_NAME, 
      m.FIRST_NAME, 
      m.PROCESS_LEVEL, 
      s.[DUAL EMPLOYEE], 
      a.PROCESS_LEVEL 
    --can’t have an order by here
    ) as b
                order by Dual_Process_Level_Comparison desc, process_level_compare desc

结果

|EMPLOYEE|FIRST_NAME| LAST_NAME|PL_1 |PL_2 |PL_3|PL_4|PL_5|PL_6|DUAL EMPLOYEE|DUAL_PROCESS_LEVEL|process_level_compare|
+--------+----------+----------+-----+-----+----+----+----+----+-------------+------------------+---------------------+
|73202   |  TEST    | EMPLOYEE |MELRO|LSBCW|NULL|NULL|NULL|NULL|blank        |NULL              |        REVIEW       |
|73202   |  TEST    | EMPLOYEE |MELRO|NULL |NULL|NULL|NULL|NULL|blank        |NULL              |        MATCH        |

您可以看到这是一个重复的员工,它应该只显示一条记录。其中记录应该是最高记录。当我分组时

a.EMPLOYEE, 
m.LAST_NAME, 
m.FIRST_NAME, 
m.PROCESS_LEVEL, 
s.[DUAL EMPLOYEE], 
a.PROCESS_LEVEL 

这是我得到的结果。当我在下面创建这个新查询时,它只显示一条记录,因为 a.EMPLOYEE 是我唯一分组的记录。但是当您查看同一员工的输出时,process_level_compare 并没有说“审查”。但现在没有重复的员工。我在这里缺少什么来获得它,所以我没有更多的重复,所以它是否显示该员工的“匹配”?

         select 
                   b.EMPLOYEE,
                   FIRST_NAME,
                   LAST_NAME,
                   PL_1,
                   PL_2,
                   PL_3,
                   PL_4,
                   PL_5,
                   PL_6,
                   DUAL_EMPLOYEE,
                   Dual_Process_Level_Comparison,

                   case when b.Primary_Compare_Number <> b.Supplemental_Compare_Number then 'REVIEW' else 'MATCH' end as process_level_compare
            FROM
            (
            select 
              a.EMPLOYEE, 
              Min(m.FIRST_NAME) as FIRST_NAME, 
              Min(m.LAST_NAME) as LAST_NAME, 
             MAX(m.PROCESS_LEVEL) as PL_1, 
              max(case when a.POS_LEVEL = 2 then a.PROCESS_LEVEL end) as PL_2, 
              max(case when a.POS_LEVEL = 3 then a.PROCESS_LEVEL end) as PL_3, 
              max(case when a.POS_LEVEL = 4 then a.PROCESS_LEVEL end) as PL_4, 
              max(case when a.POS_LEVEL = 5 then a.PROCESS_LEVEL end) as PL_5, 
              max(case when a.POS_LEVEL = 6 then a.PROCESS_LEVEL end) as PL_6, 
               MAX(case when s.[DUAL EMPLOYEE] = 'UNASSIGNED' then ' ' else s.[DUAL EMPLOYEE] end )as DUAL_EMPLOYEE, 
             MAX( case when m.PROCESS_LEVEL = s.[DUAL EMPLOYEE] then 'REVIEW' end) as Dual_Process_Level_Comparison, 
             MAX( case  when m.PROCESS_LEVEL in ('CALL') then 1 
                when m.PROCESS_LEVEL in ('ECCHS', 'HCCHS') then 2 
                   when m.PROCESS_LEVEL in ('ESCH', 'HCLER', 'HSCH') then 3 
                   when m.PROCESS_LEVEL in ('LPBNO', 'LSBCR', 'LSBCW', 'LTBC','LTBH', 'LTBV', 'LTCLR', 'LTCS', 'LTHC','LTMON', 'LTSBC') then 4 
                   when m.PROCESS_LEVEL in ('MELRO') then 5 
                   when m.PROCESS_LEVEL in ('PLONG') then 6 
                   when m.PROCESS_LEVEL in ('PNSVL') then 7 
                   when m.PROCESS_LEVEL in ('SAUK') then 8 
                   when m.PROCESS_LEVEL in ('TMONT') then 9 
                   when m.PROCESS_LEVEL in ('WACM') then 10 
                   when m.PROCESS_LEVEL in ('WCRS', 'WFPMC', 'WRDWF') then 11 
              end) as Primary_Compare_Number,   

              Max(case 
                when a.PROCESS_LEVEL in ('CALL') then 1 
                when a.PROCESS_LEVEL in ('ECCHS', 'HCCHS') then 2 
                   when a.PROCESS_LEVEL in ('ESCH', 'HCLER', 'HSCH') then 3 
                   when a.PROCESS_LEVEL in ('LPBNO', 'LSBCR', 'LSBCW', 'LTBC', 'LTBH', 'LTBV', 'LTCLR', 'LTCS', 'LTHC', 'LTMON', 'LTSBC') then 4 
                   when a.PROCESS_LEVEL in ('MELRO') then 5 
                   when a.PROCESS_LEVEL in ('PLONG') then 6 
                   when a.PROCESS_LEVEL in ('PNSVL') then 7 
                   when a.PROCESS_LEVEL in ('SAUK') then 8 
                   when a.PROCESS_LEVEL in ('TMONT') then 9 
                   when a.PROCESS_LEVEL in ('WACM') then 10 
                   when a.PROCESS_LEVEL in ('WCRS', 'WFPMC', 'WRDWF') then 11 
              end )as Supplemental_Compare_Number
            from 
              dbo.vw_PAEMPPOS a 
              join dbo.COMPLETE_EMPLOYEE_MASTER m on m.EMPLOYEE = a.EMPLOYEE 
              join dbo.HR_EMPUSERFIELDS s on s.EMPLOYEE = m.EMPLOYEE 


            where END_DATE = '2099-12-31 00:00:00.000' 
              and EMP_STATUS NOT IN ('1A', 'RT', 'SZ', 'T1', 'XD', 'XV', 'ZZ') 
            group by 
              a.EMPLOYEE
            ) as b
            order by Dual_Process_Level_Comparison desc, process_level_compare desc

结果:

 |EMPLOYEE|FIRST_NAME| LAST_NAME|PL_1 |PL_2 |PL_3|PL_4|PL_5|PL_6|DUAL EMPLOYEE| DUAL_PROCESS_LEVEL|process_level_compare|
 +--------+----------+----------+-----+-----+----+----+----+----+-------------+-------------------+---------------------+
 |73202   |TEST      | EMPLOYEE |MELRO|LSBCW|NULL|NULL|NULL|NULL|blank        |NULL               |        MATCH        |

最终目标是每个员工有一个记录,但如果其中有任何值,则显示所有 PL_1 到 PL_6。如果 Primary_Compare_Number 与 Supplemental_Compare_number 不同,还要在 process_level_compare 列中标记“REVIEW”。

Desired Output
     +--------+----------+----------+-----+-----+----+----+----+----+-------------+-------------------+---------------------+
     |73202   |TEST      | EMPLOYEE |MELRO|LSBCW|NULL|NULL|NULL|NULL|blank        |NULL               |        REVIEW       |

内部查询结果

|EMPLOYEE|FIRST_NAME| LAST_NAME|PL_1 |PL_2 |PL_3|PL_4|PL_5|PL_6|DUAL EMPLOYEE|DUAL_PROCESS_LEVEL|Primary_Compare_Number|Supplemental_Compare_Number|
+--------+----------+----------+-----+-----+----+----+----+----+-------------+------------------+---------------------+----------------------------+
|73202   |  TEST    | EMPLOYEE |MELRO|LSBCW|NULL|NULL|NULL|NULL|blank        |NULL              |        5            |        5                   |

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    从您的内部选择中,您只会得到一个用于Primary_Compare_Number 的数字和一个用于Supplemental_Compare_Number 的数字,因为您已将group by a.Employee 选择为PROCESS_LEVEL 列的最大值。

    要为同一员工设置两行,您必须按该列(具有不同值的列)进行分组,这在您的第一次选择中已经以某种方式完成。这里最大的问题是我们不知道你的最终目标是什么……在你之前的结果中,你的结果中有两个,所以在某种程度上你知道该怎么做……

    如你所见:

    case when b.Primary_Compare_Number <> b.Supplemental_Compare_Number 
         then 'REVIEW' 
         else 'MATCH' 
    end as process_level_compare
    

    正如您从内部查询中向我们提供的结果,如下所示:

    case when 5 <> 5    --when 5 is not equal to 5
         then 'REVIEW'  --then result is 'REVIEW'
         else 'MATCH'   --else result is 'MATCH'
    end as process_level_compare --put the result in new column named process_level_compare 
    

    如果您想比较 5 和 4,请更改:

    Max(case when a.PROCESS_LEVEL in ('CALL') then 1 
             when a.PROCESS_LEVEL in ('ECCHS', 'HCCHS') then 2 
             when a.PROCESS_LEVEL in ('ESCH', 'HCLER', 'HSCH') then 3 
             when a.PROCESS_LEVEL in ('LPBNO', 'LSBCR', 'LSBCW', 'LTBC', 'LTBH', 'LTBV', 'LTCLR', 'LTCS', 'LTHC', 'LTMON', 'LTSBC') then 4 
             when a.PROCESS_LEVEL in ('MELRO') then 5 
             when a.PROCESS_LEVEL in ('PLONG') then 6 
             when a.PROCESS_LEVEL in ('PNSVL') then 7 
             when a.PROCESS_LEVEL in ('SAUK') then 8 
             when a.PROCESS_LEVEL in ('TMONT') then 9 
             when a.PROCESS_LEVEL in ('WACM') then 10 
             when a.PROCESS_LEVEL in ('WCRS', 'WFPMC', 'WRDWF') then 11 
     end )as Supplemental_Compare_Number
    

    TO THIS(差异只有 MAX 到 MIN):

    Min(case when a.PROCESS_LEVEL in ('CALL') then 1 
             when a.PROCESS_LEVEL in ('ECCHS', 'HCCHS') then 2 
             when a.PROCESS_LEVEL in ('ESCH', 'HCLER', 'HSCH') then 3 
             when a.PROCESS_LEVEL in ('LPBNO', 'LSBCR', 'LSBCW', 'LTBC', 'LTBH', 'LTBV', 'LTCLR', 'LTCS', 'LTHC', 'LTMON', 'LTSBC') then 4 
             when a.PROCESS_LEVEL in ('MELRO') then 5 
             when a.PROCESS_LEVEL in ('PLONG') then 6 
             when a.PROCESS_LEVEL in ('PNSVL') then 7 
             when a.PROCESS_LEVEL in ('SAUK') then 8 
             when a.PROCESS_LEVEL in ('TMONT') then 9 
             when a.PROCESS_LEVEL in ('WACM') then 10 
             when a.PROCESS_LEVEL in ('WCRS', 'WFPMC', 'WRDWF') then 11 
     end )as Supplemental_Compare_Number
    

    附:尝试使问题尽可能简短,以代表您遇到的问题。此外,一些原始数据会很好(没有所有这些列,您不需要得到您需要的答案)。

    【讨论】:

    • 最终目标是每个员工有一个记录,但如果其中有任何值,则显示所有 PL_1 到 PL_6。如果 Primary_Compare_Number 与 Supplemental_Compare_number 不同,还要在 process_level_compare 列中标记“REVIEW”。
    • 这里一秒查询错误
    • 我刚刚添加了正确的分组方式:a.employee results
    • 如您所见,主要和补充都是 5。当我希望 Melro 为 5 和 LSBCW 为 4。那么补充输出将为 4。因此当我运行完整查询它需要将 process_level_compare 设置为 'Review'
    • @CaptainJackDaniels 检查我的答案,我已经更新了。另请注意,现在您可以对对您有帮助的答案进行投票,并且您可以标记正确的答案。两者都可以。
    猜你喜欢
    • 1970-01-01
    • 2015-02-12
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多