2017-03-29 1 views
1

Proc SQL을 사용하고 있지만이 질문은 모든 SQL 변형과 관련이 있습니다.여러 하위 쿼리를 경우로 사용하는 필드에 대한 SQL 조건부

예를 들어
THEN (
SELECT SUM(PART_QTY) FROM RSCCParts LEFT JOIN DPO.DPO_PART_ORD_HST AS Total 
ON RSCCParts.PartID = STRIP(Total.PART_NO_ID) 
WHERE PUT(PROC_DT, YY.) LIKE '%2016%' GROUP BY PART_NO_ID) ELSE BruceDPO END 

는, 첫 번째 쿼리가 있습니다 : blanks-- CASE WHEN BruceDPO = INPUT("", 8.) --it에서 첫 번째 쿼리의 결과가 다른 하위 쿼리의 BruceDPO 값이 빈 채우는 경우에 나는 두 개의 하위 쿼리에서 값 필드 BruceDPOtest을 채우기 위해 노력하고 있어요 다음 결과;

Part DPO 

1234 100 
1235 

두 번째 행을 얻기 위해 실행 채울 수있는 데이터 참조 두 번째 하위 쿼리 : 여기에 전체 코드입니다

Part DPO 

1234 100 
1235 999 

을 :이 쿼리를 실행으로

PROC SQL; 
    CREATE VIEW DPOMergeView AS(SELECT *, 
     CASE 
      WHEN BruceDPO = INPUT("", 8.) THEN (
     SELECT SUM(PART_QTY) FROM RSCCParts LEFT JOIN DPO.DPO_PART_ORD_HST AS Total 
      ON RSCCParts.PartID = STRIP(Total.PART_NO_ID) 
     WHERE PUT(PROC_DT, YY.) LIKE '%2016%' GROUP BY PART_NO_ID) 
      ELSE BruceDPO 
     END 
    AS BruceDPOtest 
     FROM 
      RSCCParts 
     LEFT JOIN (SELECT RSCCParts.PartID AS BrucePartID, BruceDPO, Year 
      FROM RSCCParts 
       LEFT JOIN 
        (SELECT PART_NO_ID AS PartNumber, SUM(PART_QTY) AS BruceDPO, STRIP(YR) AS Year 
         FROM 
          DPO.DPO_PART_HST_MAIN 
         WHERE YR = '2016' 
          GROUP BY PartNumber, Year) AS FQuery 
           ON 
           RSCCParts.PartID = STRIP(FQuery.PartNumber)) AS B 
           ON RSCCParts.PartID = B.BrucePartID); 
QUIT; 

을, DATA Step에서 멈추고 30 분 후에 쿼리를 중단했습니다. 이 일을 제대로하고 있습니까? 이 작업을 수행하는 더 좋은 방법이 있다면 알려주십시오!

+1

결합하려는 데이터 샘플이 없으면 테스트 할 수 없습니다. 'RSCCParts','DPO.DPO_PART_ORD_HST' 및'DPO.DPO_PART_HST_MAIN' 테이블에 대한 예제 데이터를 게시 할 수 있습니까? – Tom

+0

이것은 일반적인 경우의 예입니다. 내 코드는 그러한 프로그램이 가능한지 보여줄뿐입니다. 자신의 데이터를 사용하여 유사한 프로그램을 만들 수 있습니다. 불행히도 그 테이블에 대한 데이터를 게시 할 수 없습니다. –

+0

REAL 데이터를 게시 할 필요가 없습니다. 문제를 보여주는 몇 가지 기록을 작성하십시오. SASHELP.CLASS 또는 SASHELP.CARS와 같은 테이블을 사용하여 예제를 만들면 모든 사람이 이미 SAS에서 사용할 수 있습니다. – Tom

답변

1

일반적으로 SQL에서 상관 관계가있는 하위 쿼리를 피하는 이유는 세트를 조합하는 대신 레코드별로 데이터 레코드를 처리하려는 것처럼 느껴지 기 때문입니다. 그러나 구문을 사용하려는 경우

case when (x) then (sub query result) else variable_name end 

하위 쿼리는 하나의 값만 반환하면됩니다. 귀하의 질의

SELECT SUM(PART_QTY) 
FROM RSCCParts LEFT JOIN DPO.DPO_PART_ORD_HST AS Total 
ON RSCCParts.PartID = STRIP(Total.PART_NO_ID) 
WHERE PUT(PROC_DT, YY.) LIKE '%2016%' 
GROUP BY PART_NO_ID 

GROUP BY 절을 사용하고 있으므로 여러 관측을 반환하는 것처럼 보입니다. 당신은 당신이 얻을하는 데 사용할 어느 명확히 할 수 있도록 각 별칭을 소개해야 할 수도 있으므로

해서는 안 그 하위 쿼리 모양 더

SELECT SUM(Total.PART_QTY) 
FROM DPO.DPO_PART_ORD_HST AS Total 
WHERE RSCCParts.PartID = STRIP(Total.PART_NO_ID) 
    AND PUT(PROC_DT, YY.) LIKE '%2016%' 

처럼 쿼리 RSCCPARTS 테이블에 여러 개의 참조가 PARTID에서 PART_NO_ID와 (과) 일치합니다.

+0

감사합니다. Tom. 당신의 제안이 자리하고 있습니다. 필자는 귀하의 조언을 따르며, 특히 메인 쿼리의 앨리어스 및 상관 된 서브 쿼리로 사용하는 방법으로 처리했습니다. –

관련 문제