T-SQL GROUP BY nvarchar错误

时间:2015-07-02 16:48:35

标签: sql-server

我想知道是否有人可以帮助我提出请求:

以下是数据:

表1:EMPLOYEE

    FK: DID
    PK: Name 
    UserName

表2:DEPARTMENT

    PK: DID
    TerminationDate

我希望找到本季度终止员工的数量。到目前为止,这是T-SQL:

SELECT 
    DEPARTMENT.name AS Name,
    COUNT(e.userName)
FROM
    EMPLOYEE AS e
JOIN 
    DEPARTMENT ON e.department = DEPARTMENT.DID

UNION 

SELECT
    u.eu, u.name 
FROM 
    (SELECT 
         dd.name, COUNT(ee.userName) AS eu
     FROM 
         DEPARTMENT AS dd
     JOIN 
         EMPLOYEE AS ee ON dd.DID = ee.department
                        AND ee.terminationDate IS NOT NULL
     WHERE
         ee.terminationDate IS NOT NULL
         AND ee.terminationDate BETWEEN '2015-04-01' AND '2015-06-30'
     GROUP BY 
         dd.name, ee.userName) AS u
GROUP BY 
    u.eu, u.name, Name      
ORDER BY 
    Name

错误是:

  

Msg 8120,Level 16,State 1,Line 1
  列'DEPARTMENT.name'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

2 个答案:

答案 0 :(得分:0)

在查询的第一部分中,您在select子句中列出部门名称,但不要将其包含在group by子句中(因为它缺少)

select DEPARTMENT.name as Name, COUNT(e.userName)
from EMPLOYEE as e
join DEPARTMENT on e.department = DEPARTMENT.DID
group by DEPARTMENT.Name --add this line

答案 1 :(得分:0)

此查询的问题数量令人困惑。首先...您列出的表定义与您的查询不匹配。您有TerminationDate作为DEPARTMENT表的一个属性,在查询中,您看起来像是通过EMPLOYEE表访问它,这在那里是有意义的。所以我假设您的表结构确实是:

表1:员工

FK: DID
PK: Name 
UserName
TerminationDate

表2:部门

PK: DID
Name  

在此查询中使用UNION的方式让我相信您对UNION语句的作用有误解。 UNION用于将两个集合合并为一个集合。所以在集理论{1,2,3}中,{{4,4}}是{1,2,3,3,4}。在SQL Server中,您必须确保第一个select语句中的类型和列数与所有与其联合的选择匹配。例如:

 Select 1 A, 2 B
 Union
 Select 3 B

会出现此错误,因为第一个选择有两列而第二个只有一列:

  

Msg 205,Level 16,State 1,Line 3所有查询都使用UNION组合,   INTERSECT或EXCEPT运算符必须具有相同数量的表达式   在他们的目标列表中。

这个查询:

 Select 1 A
 Union
 Select 'Bob' A

由于列类型不匹配,会出现此错误:

  

消息245,级别16,状态1,行2转换时转换失败   varchar值' Bob'数据类型int。

如果你要找的是两个日期之间终止的员工人数,那么你真的没有什么可以结合的。所有员工已经在一起(Employee表)......你只需要过滤你想要的日期并计算记录总数。你甚至不需要DEPARTMENT表来计算它。

我可以为你写这个问题......但我会把剩下的留给你。