如何在SQL Server 2008中使用CASE语句和Sub Query

时间:2014-03-04 21:51:01

标签: sql sql-server-2008 tsql

我有以下查询。

SELECT * 
FROM 
    (SELECT 
        Users.ccMailName as [User Name], 
        (CASE WHEN UserRoleAssigns.Team_ID > 0 THEN (select Team from Teams where team_ID = UserRoleAssigns.team_id) Else "All"  END) as Team, 
        Users.User_WWID [WWID], 
        Users.Created_Date, 
        Role, 
        COUNT(Role) as HasRole
     FROM  
        UserRoles 
     RIGHT OUTER JOIN 
        UserRoleAssigns ON UserRoles.Role_ID = UserRoleAssigns.Role_ID 
     RIGHT OUTER JOIN 
        Users ON UserRoleAssigns.User_WWID = Users.User_WWID
     GROUP BY 
        Users.ccMailName, Users.Created_Date, Users.User_WWID, Role, UserRoleAssigns.Team_ID
) as Tbl1
  PIVOT (
    SUM(HasRole)
    FOR [Role] IN (
      ' + @PivotColumnHeaders + '
    )
  ) AS pt
ORDER BY Created_Date desc '

当我运行它时,我收到以下错误:

  

无效的列名称“全部”。

查询工作正常,没有case语句,只有子查询。基本上,首先我要检查是否UserRoleAssigns.Team_ID > 0。如果是,则从子查询中获取数据。

否则将值默认为“全部”。

由于

1 个答案:

答案 0 :(得分:0)

你可以像这样重写你的SQL:

SELECT * 
FROM 
    (SELECT 
        Users.ccMailName as [User Name], 
        (CASE WHEN UserRoleAssigns.Team_ID > 0 THEN UserRoleAssigns.team_id Else 'All'  END) as Team, 
        Users.User_WWID [WWID], 
        Users.Created_Date, 
        Role, 
        COUNT(Role) as HasRole
     FROM  
        UserRoles 
     RIGHT OUTER JOIN 
        (select * from UserRoleAssigns u left join select Team from Teams t on u.team_ID=t.eam_ID) UserRoleAssigns
        ON UserRoles.Role_ID = UserRoleAssigns.Role_ID 
     RIGHT OUTER JOIN 
        Users ON UserRoleAssigns.User_WWID = Users.User_WWID

     GROUP BY 
        Users.ccMailName, Users.Created_Date, Users.User_WWID, Role, UserRoleAssigns.Team_ID
) as Tbl1
  PIVOT (
    SUM(HasRole)
    FOR [Role] IN (
      ' + @PivotColumnHeaders + '
    )
  ) AS pt
ORDER BY Created_Date desc '

如果你将sql分配给一个变量,我认为你因为枢轴部分的构造而正在做,那么你可能需要通过使用两个单引号来逃避'All'中的单引号,即''All ''