在sql server的组中使用子查询

时间:2017-01-23 09:56:48

标签: sql 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

2 个答案:

答案 0 :(得分:1)

尝试以下查询或在group 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 ...

GET http://localhost/fonts/fonts.css

答案 1 :(得分: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