2017-10-17 130 views
-3

我有三个表像波纹管SQL查询组由case语句

**tRole** 
+--------+----------+-----------+ 
| RoleID | RoleCode | RoleTitle | 
+--------+----------+-----------+ 
|  1 | Role1 | RT1  | 
|  2 | Role2 | RT2  | 
|  3 | Role3 | RT3  | 
+--------+----------+-----------+ 

**tEmployee** 
+-------+-------+ 
| EmpID | Name | 
+-------+-------+ 
|  1 | Emp 1 | 
|  2 | Emp 2 | 
|  3 | Emp 3 | 
+-------+-------+ 

**tEmployeeRole** 

+-------+--------+ 
| EmpID | RoleID | 
+-------+--------+ 
|  1 |  1 | 
|  1 |  2 | 
|  2 |  1 | 
|  2 |  2 | 
|  3 |  3 | 
+-------+--------+ 

我要像下方的输出,如果一个角色只有一个员工,然后员工姓名映射将显示其他明智的多会展现出来。

+--------+----------+-----------+----------+ 
| RoleID | RoleCode | RoleTitle | Employee | 
+--------+----------+-----------+----------+ 
|  1 | Role1 | RT1  | Multiple | 
|  2 | Role2 | RT2  | Multiple | 
|  3 | Role3 | RT3  | Emp 3 | 
+--------+----------+-----------+----------+ 

我写的波纹管查询,但是当我通过emp.First_Name一组,那么结果是错误的

select cr.RoleCode,cr.RoleID, 
case 
when count(ear.RoleID)=1 then emp.First_Name 
else 'M' end as 'AssignedTO' 

from tRole as cr 
left outer join tEmployeeRole as ear on cr.RoleID=ear.RoleID 
left outer join tEmployee as emp on ear.EmployeeID=emp.EmployeeID 
group by cr.RoleCode,crRoleID,emp.First_Name 

回答

1

你好,你可以使用此查询您的解决方案: 你需要分区和使用计数不同的数据

DECLARE @tRole TABLE (
      RoleID INT 
      ,RoleCode VARCHAR(50) 
      ,RoleTitle VARCHAR(50) 
      ) 
    DECLARE @tEmployee TABLE (
      EmpID INT 
      ,EmpName VARCHAR(50) 
      ) 
    DECLARE @tEmployeeRole TABLE (EmpID INT, RoleID INT) 


    INSERT @tRole (RoleID, RoleCode, RoleTitle) 
     SELECT 1, 'Role1', 'RT1' 
     UNION 
     SELECT 2, 'Role2', 'RT2' 
     UNION 
     SELECT 3, 'Role3', 'RT3' 


    INSERT @tEmployee (EmpID, EmpName) 
     SELECT 1, 'Epm 1' 
     UNION 
     SELECT 2, 'Epm 2' 
     UNION 
     SELECT 3, 'Epm 3' 


    INSERT @tEmployeeRole (EmpID, RoleID) 
     SELECT 1, 1 
     UNION 
     SELECT 1, 2 
     UNION 
     SELECT 2, 1 
     UNION 
     SELECT 2, 2 
     UNION 
     SELECT 3, 3 



    SELECT DISTINCT tRole.RoleID 
    , RoleCode 
    , RoleTitle 
    , CASE WHEN COUNT(tEmployeeRole.EmpID) OVER (PARTITION BY tEmployee.EmpID) = 1 THEN tEmployee.EmpName ELSE 'Multiple'END [Employee] 
     FROM @tEmployee tEmployee 
     LEFT OUTER JOIN @tEmployeeRole tEmployeeRole ON tEmployeeRole.EmpID = tEmployee.EmpID 
     LEFT OUTER JOIN @tRole tRole ON tRole.RoleID = tEmployeeRole.RoleID 
0

您可以修改从@Pratik答案添加一个山坳,其中列出了员工

;with CTE as(
SELECT 
DISTINCT tRole.RoleID 
RoleCode 
, RoleTitle 
, CASE WHEN COUNT(tEmployeeRole.EmpID) OVER (PARTITION BY tEmployee.EmpID) = 1 THEN tEmployee.EmpName ELSE 'Multiple'END [Employee] 
FROM @tEmployee tEmployee 
LEFT OUTER JOIN @tEmployeeRole tEmployeeRole ON tEmployeeRole.EmpID = tEmployee.EmpID 
LEFT OUTER JOIN @tRole tRole ON tRole.RoleID = tEmployeeRole.RoleID 
) 
select * 
,stuff((select ','+EmpName from @tEmployee IE inner join @tEmployeeRole IER on IE.EmpID = IER.EmpID where IER.RoleID = CTE.rolecode for xml PATH('') ),1,1,'') AS EMList 
from CTE 
0

此查询可能会帮助你。做一个尝试

你的表格数据看起来像

create TABLE #tRole (RoleID INT ,RoleCode VARCHAR(50) ,RoleTitle VARCHAR(50)) 

create TABLE #tEmployee (EmpID INT ,EmpName VARCHAR(50)) 

create TABLE #tEmployeeRole(EmpID INT, RoleID INT) 


INSERT #tRole (RoleID, RoleCode, RoleTitle) 
SELECT 1, 'Role1', 'RT1' 
UNION 
SELECT 2, 'Role2', 'RT2' 
UNION 
SELECT 3, 'Role3', 'RT3' 

INSERT #tEmployee (EmpID, EmpName) 
SELECT 1, 'Epm 1' 
UNION 
SELECT 2, 'Epm 2' 
UNION 
SELECT 3, 'Epm 3' 

INSERT #tEmployeeRole (EmpID, RoleID) 
SELECT 1, 1 
UNION 
SELECT 1, 2 
UNION 
SELECT 2, 1 
UNION 
SELECT 2, 2 
UNION 
SELECT 3, 3 

所需的查询

;with cte as 
(
select tr.roleid,tr.rolecode,tr.roletitle,te.empname 
,COUNT(ter.EmpID) OVER (PARTITION BY ter.EmpID) as emp_count 
from #tEmployee te 
inner join #tEmployeeRole tER on tER.empid=te.empid 
inner join #tRole tr on tr.roleid=ter.roleid 
) 
select distinct RoleID,RoleCode,RoleTitle 
,case when emp_count>1 then 'Multiple' else empname end as Employee 
from cte