存在条件查询的子查询,分组依据

问题描述 投票:-1回答:2

我有以下查询,我需要添加其他列以指示一组行是否在一个列中包含特定值('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'

enter image description here

sql sql-server-2014
2个回答
0
投票

事实证明,这比我想像的要容易,并且不需要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]

-1
投票

我的评论的解释:

如果此查询:

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

© www.soinside.com 2019 - 2024. All rights reserved.