2017-01-23 57 views
1

大家好我想使用子查询作为代码低音但它会得到错误我想问你,我该如何做到这一点。谢谢!在分组中使用子查询由sql server

SELECT HR_EMPMAST.DEPT,HR_DEPARTMENT.DESCRIPTION AS DEPARTMENT,HR_JOBFUNCTION.CODE,HR_JOBFUNCTION.DESCRIPTION AS POSITION, 
COUNT(HR_EMPMAST.EMPCODE) ACTUAL, 
SUM(CASE WHEN HR_EMPMAST.SEX = 'M' THEN 1 ELSE 0 END) AS M, 
SUM(CASE WHEN HR_EMPMAST.SEX = 'F' THEN 1 ELSE 0 END) AS F,SUM(CASE WHEN HR_EMPMAST.EMPTYPE='LOCAL' THEN 1 ELSE 0 END) AS LOCALEMP, 
SUM(CASE WHEN HR_EMPMAST.EMPTYPE='EXPAT' THEN 1 ELSE 0 END) AS EXPATEMP--, 
(SELECT EMPNO FROM HR_HEADCOUNT WHERE POSITION=HR_EMPMAST.JOBCODE AND INMONTH=1 AND INYEAR=2017) AS EMPNO 
FROM HR_EMPMAST 
LEFT JOIN HR_DEPARTMENT 
ON HR_EMPMAST.DEPT = HR_DEPARTMENT.CODE 
LEFT JOIN HR_JOBFUNCTION 
ON HR_EMPMAST.JOBCODE=HR_JOBFUNCTION.CODE 
WHERE HR_EMPMAST.CAREERDESC <> 'TERMIMATE' 
GROUP BY HR_EMPMAST.DEPT,HR_DEPARTMENT.DESCRIPTION,HR_JOBFUNCTION.CODE,HR_JOBFUNCTION.DESCRIPTION 

enter image description here

+0

1)向我们展示的错误信息 - 如文本。 2)尝试格式化您的代码。 – jarlh

+0

你能点击'enter image description here' – Kosal

+2

一般的GROUP BY规则说:如果指定了GROUP BY子句,SELECT列表中的每个列引用必须标识一个分组列或者是一个set函数的参数! – jarlh

回答

1

首先,请使用table aliases。第二种:您需要将SELECT中的所有列添加到GROUP BY(但不包括SUM和COUNT函数中的所有列)。

第三:你有奇怪的EMPNO选择。也许更好的方法是使用JOIN

尝试使用此一:

SELECT e.DEPT, 
     d.DESCRIPTION AS DEPARTMENT, 
     jf.CODE, 
     jf.DESCRIPTION AS POSITION, 
     COUNT(e.EMPCODE) ACTUAL, 
     SUM(CASE WHEN e.SEX = 'M' THEN 1 ELSE 0 END) AS M, 
     SUM(CASE WHEN e.SEX = 'F' THEN 1 ELSE 0 END) AS F, 
     SUM(CASE WHEN e.EMPTYPE='LOCAL' THEN 1 ELSE 0 END) AS LOCALEMP, 
     SUM(CASE WHEN e.EMPTYPE='EXPAT' THEN 1 ELSE 0 END) AS EXPATEMP, 
     hc.EMPNO 
FROM HR_EMPMAST e 
LEFT JOIN HR_DEPARTMENT d 
    ON e.DEPT = d.CODE 
LEFT JOIN HR_JOBFUNCTION jf 
    ON e.JOBCODE = jf.CODE 
LEFT JOIN HR_HEADCOUNT hc 
    ON hc.POSITION = e.JOBCODE AND hc.INMONTH=1 AND hc.INYEAR=2017 
WHERE e.CAREERDESC <> 'TERMIMATE' 
GROUP BY e.DEPT, 
     d.DESCRIPTION, 
     jf.CODE, 
     jf.DESCRIPTION, 
     hc.EMPNO 
+1

我想说,谢谢你的回答,它现在正在工作。 – Kosal

1

在组试试这个下面的查询或包括HR_EMPMAST.JOBCODE by子句...

SELECT HR_EMPMAST.DEPT,HR_DEPARTMENT.DESCRIPTION AS DEPARTMENT,HR_JOBFUNCTION.CODE,HR_JOBFUNCTION.DESCRIPTION AS POSITION, 
COUNT(HR_EMPMAST.EMPCODE) ACTUAL, 
SUM(CASE WHEN HR_EMPMAST.SEX = 'M' THEN 1 ELSE 0 END) AS M, 
SUM(CASE WHEN HR_EMPMAST.SEX = 'F' THEN 1 ELSE 0 END) AS F,SUM(CASE WHEN HR_EMPMAST.EMPTYPE='LOCAL' THEN 1 ELSE 0 END) AS LOCALEMP, 
SUM(CASE WHEN HR_EMPMAST.EMPTYPE='EXPAT' THEN 1 ELSE 0 END) AS EXPATEMP, 

em.EMPNO AS EMPNO 

FROM HR_EMPMAST 

LEFT JOIN (SELECT POSITION, EMPNO FROM HR_HEADCOUNT WHERE INMONTH=1 AND INYEAR=2017) em on em.POSITION=HR_EMPMAST.JOBCODE 

LEFT JOIN HR_DEPARTMENT 
ON HR_EMPMAST.DEPT = HR_DEPARTMENT.CODE 
LEFT JOIN HR_JOBFUNCTION 
ON HR_EMPMAST.JOBCODE=HR_JOBFUNCTION.CODE 
WHERE HR_EMPMAST.CAREERDESC <> 'TERMIMATE' 
GROUP BY HR_EMPMAST.DEPT,HR_DEPARTMENT.DESCRIPTION,HR_JOBFUNCTION.CODE,HR_JOBFUNCTION.DESCRIPTION 
+0

我想说,谢谢你的回答。 – Kosal