需要帮助sql查询

时间:2011-08-30 05:05:09

标签: sql-server-2005 stored-procedures

我在下面的EmployeeShiftAllocationShiftMaster(两个转换为两个班次:Shift1和shift2)表中提供了一个查询

SELECT     
   Em.EmployeeId, Em.EmployeeName,
   Sa.ShiftAllocationDate, Sa.ShiftId2, Sa.ShiftId, Sm.ShiftName,
   Sm2.ShiftName AS ShiftName2, Sa.ShiftAllocationId 
FROM        
   ShiftAllocation AS Sa 
INNER JOIN
   EmployeeMaster AS Em ON Sa.EmployeeId = Em.EmployeeId 
LEFT OUTER JOIN
   ShiftMaster AS Sm2 ON Sa.ShiftId2 = Sm2.ShiftId
LEFT OUTER JOIN
   ShiftMaster AS Sm ON Sa.ShiftId = Sm.ShiftId

我收到了这个输出:

 ShiftAlld EmployeeId  EmployeeName ShiftAllDate shiftId2 ShifId ShiftName ShiftName2 
   1           19          XYZ       2011-08-01 NULL     1     General    NULL
   2           19          XYZ       2011-08-02 NULL     1     General    NULL
   3           19          XYZ       2011-08-02 NULL    -1     NULL       NULL
   4           19          XYZ       2011-08-02 NULL     1     General    NULL
   5           19          XYZ       2011-08-02 NULL    -2     NULL       NULL
   6           19          XYZ       2011-08-02 NULL     1     General    NULL

我想要

  • shiftId -1 值应将ShiftName指定为周关闭
  • ShiftId -2 值应将ShiftName指定为假日
  • ShiftId2 NULL 值应将ShiftName2指定为未分配

我想要这个输出:

ShiftAlld EmployeeId  EmployeeName ShiftAllDate shiftId2 ShifId ShiftName ShiftName2 
   1           19          XYZ       2011-08-01 NULL     1     General    NotAssign  
   2           19          XYZ       2011-08-02 NULL     1     General    NotAssign  
   3           19          XYZ       2011-08-02 NULL    -1     WeekOff    NotAssign  
   4           19          XYZ       2011-08-02 NULL     1     General    NotAssign  
   5           19          XYZ       2011-08-02 NULL    -2     Holiday    NotAssign  
   6           19          XYZ       2011-08-02 NULL     1     General    NotAssign  

2 个答案:

答案 0 :(得分:2)

您可以使用类似这样的案例(未经测试,因此可能存在任何数量的拼写错误。)

select Em.EmployeeId, 
       Em.EmployeeName,
       Sa.ShiftAllocationDate, 
       Sa.ShiftId2, 
       Sa.ShiftId, 
       case when sa.ShiftId = -1 then 'Week Off'
            when sa.ShiftId = -2 then 'Holiday'
            else sm.ShiftName
       end as ShiftName,
       case when sm2.ShiftId is null then 'Not assigned'
            else Sm2.ShiftName
       end as ShiftName2, 
       Sa.ShiftAllocationId 
from ShiftAllocation as Sa 
  inner join EmployeeMaster as Em 
    on Sa.EmployeeId = Em.EmployeeId 
  left outer join ShiftMaster as Sm2 
    on Sa.ShiftId2 = Sm2.ShiftId 
  left outer join ShiftMaster as Sm 
    on Sa.ShiftId = Sm.ShiftId

答案 1 :(得分:1)

虽然我不确定这是否是最佳方式;您可以尝试在SQL中使用CASE来获得解决方案。

修改:如果您想尝试,此http://www.dba-oracle.com/t_case_sql_clause.htm可以为您提供帮助。