Пример запроса для подзапроса Exists с Group by - PullRequest
0 голосов
/ 28 января 2020

У меня следующий запрос, мне нужно добавить дополнительный столбец, чтобы указать, содержит ли группа строк указанное значение c ('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

РЕДАКТИРОВАТЬ: Вот упрощенный пример (желаемого) вывода (с меньшим количеством столбцов ): Если тот же HRS_PERSON_ID имеет хотя бы 1 строку с «PROB», тогда создайте все строки для этого человека «Y». Если HRS_PERSON_ID не имеет строк с «PROB», тогда все строки «N»

enter image description here

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Оказывается, это было проще, чем я думал, и не требовало 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]
0 голосов
/ 28 января 2020

Объяснение моего комментария:

Если этот запрос:

select i,j
from test

возвращает это

i           j
----------- -----------
1           10
2           10
3           10
4           9

Тогда, по какой-то причине, вы можете сделать этот запрос в MySQL

SELECT j
FROM test
GROUP BY i

Но этот запрос не выполняется в MS SQL (как и должно быть!), Поскольку MS SQL не может определить, какое значение следует вернуть для j. Должно ли оно быть ниже, больше или какое-то случайное значение (например, что делает MySQL).

Решение состоит в том, чтобы написать что-то вроде:

SELECT MIN(j)
FROM test
GROUP BY i

, чтобы получить минимальное значение для j в каждой группе.

Или, если вы действительно clueless, вы можете написать:

SELECT 1
FROM test
GROUP BY i

Это вернет значение 1 для каждой найденной группы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...