2016-09-13 30 views
0

SQL不是我的专业知识,但是,如何编写一个SQL查询,该查询从两个不同记录获取值并将它们放在一行中?例如,我对此EmployeeId进行了查询,并且我需要Vacation_Type列中的输出值为2016-07-01(如果存在)Adjust和2016-08-01(对每个员工都存在)的Forward值?所需的输出将是:将SQL记录值放在一行中

26, SL, 547.58, -37.42 

Query Output

并不是每个员工将有调整的记录,他们有当他们在病假帽的调整...而不是每个人都超过了上限。谢谢!

回答

2
select 
    EV.EmployeeID, 
    EV.Vacation_Kind, 
    stuff(( select ', ' + convert(varchar(30), EV1.Value) from EmployeeVacations EV1 
       where EV1.EmployeeID = EV.EmployeeID and EV1.Vacation_Kind = EV.Vacation_Kind 
       and EV1.VacationType in ('Adjust','Forward') and EV1.CreationDate IN (EV.CreationDate, dateadd(month, datediff(month, 0, dateadd(month, 1, EV.CreationDate)), 0)) 
       for xml path('') 
      ), 1, 1, '') 
from 
    EmployeeVacations EV 
where 
    EV.EmployeeID = 26 and EV.Vacation_Kind = 'SL'and VacationType = 'Adjust' 
group by 
    EV.EmployeeID, EV.Vacation_Kind, EV.CreationDate 
+0

可能这项工作,请尝试 – BhatiaAshish

+0

这一个完美的工作我去掉后“,其中EV.EmployeeID = 26“,并获得了我需要的所有记录。谢谢! – RickCJ7

1

由于“调整”记录不能保证在那里,所以可以使用LEFT OUTER JOIN。下面的查询所有员工,但你可以取消这两条线,如果你真的只希望员工26 ...

SELECT 
    CAST(fwd.EmployeeId AS varchar) + ', ' + 
    fwd.Vacation_Kind + ', ' + 
    CAST(fwd.[Value] as varchar) + 
    CASE WHEN adj.Value IS NULL THEN '' ELSE ', ' + CAST(adj.Value AS varchar) END 
FROM 
    @employeeVacations fwd 
    LEFT OUTER JOIN @employeeVacations adj ON 
     adj.EmployeeId = fwd.EmployeeId) 
     AND 
     adj.Vacation_Kind = 'SL') 
     AND 
     adj.Vacation_Type = 'Adjust' 
     AND 
     adj.CreationDate = '2016-07-01' 
WHERE 
    --fwd.EmployeeId = 26 
    --AND 
    fwd.Vacation_Kind = 'SL' 
    AND 
    fwd.Vacation_Type = 'Forward' 
    AND 
    fwd.CreationDate = '2016-08-01' 
相关问题