如何在sql中的单行中附加具有多个值的人员的详细信息

时间:2017-05-23 05:03:34

标签: sql sql-server sql-server-2008

您好我想将第5列添加为"离开",我通过此查询获得以下结果

 Empname      Deptname     LeaveType   TotalLeave    
 ------------------------------------------------
 Andrew       CSE          SickLeave      3     
 George       IT           CasualLeave    1     
 Andrew       CSE          CasualLeave    2    
 George       IT           SickLeave      2 

这是我的查询

Select EmployeeDetails.Empname,
       DepartmentDetails.Deptname ,
       LeaveApplication.LeaveType,
       Sum(LeaveApplication.NoOfDays) As TotalLeave 
From DepartmentDetails 
Inner JOIN EmployeeDetails on EmployeeDetails.DeptID = DepartmentDetails.DeptID
INNER JOIN LeaveApplication On EmployeeDetails.EmpID = LeaveApplication.EmpID
Where  LeaveApplication.LeaveFromDate >='2017-01-01' 
       AND LeaveApplication.LeaveFromDate <='2017-05-31' 
       and  EmployeeDetails.Status=0 
       and LeaveApplication.leavetype not in ('Forgot Access Card','Permission','Work from Home','Holiday Allowance/Weekend Allowance','On Duty','Night Shift Allowance') 
       and LeaveApplication.LeaveStatus<>'Rejected'
GROUP BY LeaveApplication.EmpID ,DepartmentDetails.Deptname,EmployeeDetails.Empname,LeaveApplication.LeaveType

需要的结果

 Empname      Deptname     LeaveType              TotalLeave
 -----------------------------------------------------------
 Andrew       CSE          SickLeave-3,Casual-2             5
 George       IT           CasualLeave-1,Sickleave-2        3  

2 个答案:

答案 0 :(得分:1)

--Try This
    BEGIN TRAN 

    CREATE TABLE #Detail( Empname NVARCHAR(50),Deptname NVARCHAR(50),LeaveType NVARCHAR(100),Leave INT    )
     ------------------------------------------------

            INSERT INTO #Detail
            Select  'Andrew' ,'CSE','SickLeave',3  UNION ALL
            SELECT 'George','IT','CasualLeave',1 UNION ALL    
            Select  'Andrew','CSE','CasualLeave',2    UNION ALL
            SELECT 'George','IT','SickLeave',2 

             SELECT
                c.Empname,c.Deptname,
                STUFF((  
                        SELECT  ', ' +  CONVERT(Nvarchar,CP.LeaveType)
                        from  
                        #Detail CP

                  WHERE
                      C.Empname = CP.Empname
                  FOR XML PATH('')), 1, 2, '') LeaveType,sum(Leave)Total_Leave
            FROM
                #Detail C 
            GROUP BY Empname,Deptname
    ROLLBACK TRAN

答案 1 :(得分:1)

使用STUFF和SUM内置函数:

 CREATE TABLE #table1(Empname VARCHAR(20), Deptname VARCHAR(20),LeaveType 
         VARCHAR(20),  TotalLeave INT)

 INSERT INTO #table1(Empname , Deptname ,LeaveType ,  TotalLeave)   
 SELECT 'Andrew','CSE','SickLeave',3  UNION ALL   
 SELECT 'George','IT','CasualLeave',1  UNION ALL    
 SELECT 'Andrew','CSE','CasualLeave',2    UNION ALL
 SELECT 'George','IT','SickLeave',2 

SELECT Empname , Deptname ,  STUFF( (SELECT ',' + LeaveType FROM #table1 I2 
WHERE I2.Empname = I1.Empname FOR XML PATH('')),1,1,'') LeaveType , 
      SUM(TotalLeave) TotalLeave
FROM #table1 I1
GROUP BY Empname , Deptname