0

实际上这个问题是我的初学者 sql 连接查询的后续问题

为了减少混乱,我正在创建一个新问题,因为我不知道是否应该更新上一个问题。所以这里的问题在于GROUP BY功能。

我有一张桌子Dept_Employee

    DeptId    EmployeeId    Salary        JoinDate (DD-MM-YYYY)     DeptName
    --------------------------------------------------------------------------
    1            77         8787           11-09-2010                  ADMIN
    1            87         9877           12-08-2010                  ADMIN 
    1            76         9544           08-11-2010                  SUPPORT  
    2            33         9999           12-05-2010                  ADMIN

我想用这个DeptId和一个新的布尔列创建一个新表,如果同一部门的所有员工在joindate2010 年 1 月 12 日(12 月 1 日)之前的工资应该大于 8000 并且DeptName="Admin".

所以在这种情况下,结果应该是

    DeptId     NewEmployees
    ------------------------
    1            False
    2            True

我尝试过这样的事情

   SELECT DeptId, 
     CASE WHEN MIN(Salary) > 8000 AND 
               MAX(JoinDate) <= DATE'2010-12-01' And
               DeptName ="Admin" THEN True
          ELSE FALSE
     END AS NewEmployees
   FROM Dept_Employee
   GROUP BY DeptId

但我得到了例外

不是 GROUP BY 表达式

请任何人都可以建议正确的方法是什么?我应该以某种方式创建子查询还是什么???

吉娜。

4

4 回答 4

1
SELECT  DeptID,
        CASE WHEN totals = totalCount THEN 'TRUE' ELSE 'FALSE' END NewEmployees
FROM
(
    SELECT  DeptID, 
            SUM(CASE WHEN Salary > 8000 AND JoinDate <= DATE'2010-12-01' AND DeptName = 'ADMIN' THEN 1 ELSE 0 END) totals,
            COUNT(*) totalCount
    FROM    tableName
    GROUP   BY DeptID
) s
于 2013-02-11T15:08:05.623 回答
0

尝试这个:

SELECT Dept_Employee.DeptId, CASE WHEN OptionDept.DeptId IS NULL THEN 'False' ELSE 'True' END AS NewEmployees
FROM Dept_Employee
LEFT JOIN 
(
    SELECT DeptId
    FROM Dept_Employee
    GROUP BY DeptId
    HAVING MIN(Salary) > 8000 AND MAX(JoinDate) <= DATE'2010-12-01' AND DeptName ="Admin"
) AS OptionDept ON OptionDept.DeptId = Dept_Employee.DeptdId

说明:您不能在选择列表中引用不参与 Group By 子句的字段 - 因为在 group by 之后您正在使用组而不是单独的记录,作为一种解决方法 - 您应该使用子查询。

于 2013-02-11T15:05:16.297 回答
0

DeptName 必须出现在 GROUP BY 子句中或在聚合函数中使用。

于 2013-02-11T15:09:31.970 回答
0

这是您的 orig 查询的正确语法:

SELECT deptno 
 , (CASE WHEN MIN(Sal) > 3000 AND MAX(hiredate) <= DATE '2010-12-01' 
     AND deptno = 10 THEN 'True' ELSE 'FALSE'
    END) NewEmployees
 FROM scott.emp
GROUP BY deptno
/

这只是句法示例。不知道你想达到什么目的......

于 2013-02-11T15:22:27.973 回答