我有以下查询,我需要添加其他列以指示一组行是否在一个列中包含特定值('PROB)(在一个或多个行中);如果分组中确实包含该值,则输出“ Y”,否则输出“ N”。我添加了一个CASE
语句,您将在下面看到带注释的注释。
我收到错误Each GROUP BY expression must contain at least one column that is not an outer reference.
我不确定如何解决此问题,因为我需要根据Group By
来测试此值是否存在于此列中。
SELECT A.HRS_PERSON_ID, A.HRS_RCMNT_ID , A.HRS_OFF_ID , A.POSITION_NBR , (CONVERT(CHAR(10) ,A.OFFER_DT ,121)) , (CONVERT(CHAR(10) ,A.HRS_PROP_ST_DT ,121)) ,
(CONVERT(CHAR(10) ,A.HRS_OFR_DT_EXP ,121)) , A.HRS_ONLN_OFR_POSTD , A.JOBCODE , A.HRS_HIRING_MGR_ID , A.RECRUITER_ID , A.WC_COUNCIL_ID , B.OFFER_AMT ,
B.CURRENCY_CD , B.OFFER_FREQUENCY , B.ERNCD , B.EARNS_AMT , B.LOCATION , C.OFFER_COMPONENT , (CONVERT(CHAR(10) ,C.EFFDT ,121)) , C.DESCR , C.DESCRSHORT ,
C.OFFER_TYPE , C.MONETARY_IND , D.APP_PER_STATUS , D.EMPLID , D.HRS_EXT_TRN , D.POI_TYPE , F.COUNTRY_NM_FORMAT , F.NAME , F.NAME_INITIALS , F.NAME_PREFIX ,
F.NAME_SUFFIX , F.NAME_ROYAL_PREFIX , F.NAME_TITLE , F.LAST_NAME , F.FIRST_NAME , F.MIDDLE_NAME , F.NAME_DISPLAY , F.NAME_FORMAL , E.ADDRESS_TYPE , E.COUNTRY ,
E.ADDRESS1 , E.ADDRESS2 , E.ADDRESS3 , E.ADDRESS4 , E.CITY , E.NUM1 , E.NUM2 , E.HOUSE_TYPE , E.COUNTY , E.STATE , E.POSTAL , G.DESCR , B.SEQUENCE_NUMBER ,
H.HRS_DESCR , J.HRS_JOB_OPENING_ID , I.DESCR , I.ADDRESS1 , I.CITY , I.STATE , I.POSTAL , M.DESCR , N.DESCR , M.SAL_ADMIN_PLAN, M.STEP_FROM,
(CONVERT(CHAR(10),SUBSTRING(CONVERT(CHAR,GETDATE(),121), 1, 10),121)), M.SEC_CLEARANCE_TYPE,
---BELOW IS MY CASE STATEMENT I CREATED:
CASE WHEN EXISTS ( SELECT OFFER_COMPONENT
FROM PS_HRS_OFF_CMPNT_I
WHERE OFFER_COMPONENT = C.OFFER_COMPONENT
AND OFFER_COMPONENT = B.OFFER_COMPONENT
AND OFFER_COMPONENT = 'PROB'
GROUP BY A.HRS_PERSON_ID )
THEN 'Y'
ELSE 'N'
END AS 'PROB_CODE'
---END OF MY CASE STATEMENT---
FROM
PS_HRS_OFFER_I A
LEFT OUTER JOIN PS_PERSONAL_PHONE P ON P.EMPLID = A.RECRUITER_ID AND P.PHONE_TYPE = 'BUSN'
LEFT OUTER JOIN PS_HRS_HIRE Q ON A.HRS_PERSON_ID = Q.HRS_PERSON_ID AND A.HRS_RCMNT_ID = Q.HRS_RCMNT_ID
LEFT OUTER JOIN PS_GH_ENRLMNT_TBL R ON R.EMPLID = Q.EMPLID
LEFT OUTER JOIN PS_GH_SESSION_TBL S ON R.GH_SESSION_ID = S.GH_SESSION_ID
, PS_HRS_OFF_DTL_I B, PS_HRS_OFF_CMPNT_I C, PS_HRS_APPLICANT D, PS_HRS_APP_NAME_I F
LEFT OUTER JOIN PS_HRS_APP_ADDR_I E ON F.HRS_PERSON_ID = E.HRS_PERSON_ID
LEFT OUTER JOIN PS_STATE_TBL G ON G.STATE = E.STATE AND G.COUNTRY = E.COUNTRY
, PS_HRS_PAYMODE_VW H, PS_LOCATION_TBL I, PS_HRS_RCMNT J, PS_HRS_JOB_OPENING K, PS_HRS_JO_RQMT L, PS_POSITION_DATA M, PS_DEPT_TBL N, PS_EMPLOYEES O
WHERE
C.OFFER_COMPONENT = B.OFFER_COMPONENT
AND A.HRS_PERSON_ID = B.HRS_PERSON_ID
AND A.HRS_RCMNT_ID = B.HRS_RCMNT_ID
AND A.HRS_OFF_ID = B.HRS_OFF_ID
AND A.HRS_PERSON_ID = D.HRS_PERSON_ID
AND A.HRS_PERSON_ID = F.HRS_PERSON_ID
AND C.OFFER_COMPONENT = H.OFFER_COMPONENT
AND I.LOCATION = A.BUSINESS_UNIT
AND A.HRS_PERSON_ID = J.HRS_PERSON_ID
AND A.HRS_RCMNT_ID = J.HRS_RCMNT_ID
AND K.HRS_JOB_OPENING_ID = J.HRS_JOB_OPENING_ID
AND K.HRS_JOB_OPENING_ID = L.HRS_JOB_OPENING_ID
AND M.POSITION_NBR = A.POSITION_NBR
AND O.EMPLID = A.RECRUITER_ID
AND A.HRS_PERSON_ID = 91998
AND A.HRS_RCMNT_ID = 305223
EDIT:以下是(所需)输出(具有较少列)的简化示例:如果相同的HRS_PERSON_ID至少有1行带有“ PROB”,则对该人“ Y”进行all行。如果HRS_PERSON_ID没有任何带有'PROB'的行,则将所有行设为'N'
事实证明,这比我想像的要容易,并且不需要Group By
:
CASE WHEN (SELECT top 1 OFFER_COMPONENT
FROM PS_HRS_OFF_DTL_I
WHERE HRS_RCMNT_ID = B.HRS_RCMNT_ID
AND HRS_OFF_ID = B.HRS_OFF_ID
AND OFFER_COMPONENT = 'PROB' )
IS NOT NULL
THEN 'Y'
ELSE 'N' END AS [PROB_CODE]
我的评论的解释:
如果此查询:
select i,j
from test
返回此
i j
----------- -----------
1 10
2 10
3 10
4 9
然后,由于某种原因,您可以在MySQL中执行此查询
SELECT j
FROM test
GROUP BY i
但是该查询在MSSQL中失败(应如此!),因为MSSQL无法确定应为j
返回哪个值。它应该是较低的,较高的还是某个随机值(例如MySQL所做的事情)。
解决方案是写类似:
SELECT MIN(j)
FROM test
GROUP BY i
以获取每个组中j的最小值。
或者,如果您确实是clueless
,则可以写:
SELECT 1
FROM test
GROUP BY i
这将为找到的每个组返回值1
。