SQL개발자 (SQLD)

SQLD 장 쿼리 다회차 오답 문제(66, 80, 93, 101, 102)

유혁스쿨 2023. 6. 3. 20:34
728x90
반응형










66) 다음 중 아래 데이터 모델을 참고하여 설명에 맞게 올바르게 작성한 SQL문장을 2개 고르시오.

[설명]
우리는 매일 배치작업을 통하여 고객에게 추천할 컨텐츠를 생성하고 고객에게 추천서비스를 제공한다.
추천 컨텐츠가 엔터티에서 언제 추천을 해야 하는지를 정의하는 추천대상일자가 있어 해당일자에만 컨텐츠를 추천해야 한다.
또한 고객이 컨텐츠를 추천 받았을 때 선호하는 컨텐츠가 아닌 경우에는 고객이 비선호 컨텐츠로 분류하여 더 이상 추천받기를 원하지 않는다. 그러므로 우리는 비선호 컨텐츠 엔티티에 등록된 데이터에 대해서는 추천을 수행하지 않아야 한다.





① SELECT C.컨텐츠ID, C.컨텐츠명
        FROM 고객 A

     INNER JOIN 추천콘텐츠 B
                    ON (A.고객ID = B.고객ID)
     INNER JOIN 컨텐츠 C
                    ON (B.컨텐츠ID = C.컨텐츠ID)
     WHERE A.고객ID = #custID#
           AND B.추천대상일자 = TO_CHAR(SYSDATE, 'YYYY.MM.DD')
           AND NOT EXISTS (SELECT X.컨텐츠ID
                                             FROM 비선호컨텐츠 X
                                          WHERE X.고객ID = B.고객ID);


SELECT C.컨텐츠ID, C.컨텐츠명
        FROM 고객 A
     INNER JOIN 추천콘텐츠 B 
                    ON (A.고객ID = #custID# AND A.고객ID = B.고객ID) 
     INNER JOIN 컨텐츠 C
                    ON (B.컨텐츠ID = C.컨텐츠ID) 
     RIGHT OUTER JOIN 비선호컨텐츠 D
                                 ON (B.고객ID = D.고객ID AND B.컨텐츠ID = D.컨텐츠ID)
     WHERE B.추천대상일자 = TO_CHAR(SYSDATE, 'YYYY.MM.DD')
           AND B.컨텐츠ID IS NOT NULL;


SELECT C.컨텐츠ID, C.컨텐츠명
        FROM 고객 A
       INNER JOIN 추천콘텐츠 B
                     
ON (A.고객ID = B.고객ID)
       INNER JOIN 컨텐츠 C
                      ON (B.컨텐츠ID = C.컨텐츠ID) 
       RIGHT OUTER JOIN 비선호컨텐츠 D
                                   ON (B.고객ID = D.고객ID AND B.컨텐츠ID = D.컨텐츠ID)
     WHERE A.고객ID = #custID#
           AND
B.추천대상일자 = TO_CHAR(SYSDATE, 'YYYY.MM.DD')
           AND D.컨텐츠ID IS NULL;


SELECT C.컨텐츠ID, C.컨텐츠명
        FROM 고객 A
       INNER JOIN 추천콘텐츠 B
                      
ON (A.고객ID = #custID# AND A.고객ID = B.고객ID)
       INNER JOIN 추천콘텐츠 B 
                      ON (B.컨텐츠ID = C.컨텐츠ID)

       WHERE B.추천대상일자 = TO_CHAR(SYSDATE, 'YYYY.MM.DD')

             AND NOT EXISTS (SELECT X.컨텐츠ID
                                                      FROM 비선호컨텐츠 X
                                                  WHERE X.고객ID = B.고객ID
                                                        AND X.컨텐츠ID = B.컨텐츠ID)
 풀이



 

80) 아래와 같은 데이터 모델에 대해 sql을 수행하였다. 다음 중 수행된 SQL과 동일한 결과를 도출하는 SQL은?
① SELECT B.서비스ID, A.서비스명, A.서비스URL
        FROM 서비스 A, 서비스이용B
     WHERE A.서비스ID = B.서비스ID;


② SELECT X.서비스ID, X.서비스명, X.서비스URL
        FROM 서비스X
     WHERE NOT EXISTS (SELECT 1
                                              FROM (SELECT 서비스ID
                                                              FROM 서비스
                                                             MINUS
                                                           SELECT 서비스ID
                                                              FROM 서비스이용) Y
                                           WHERE X.서비스ID = Y.서비스ID)


 SELECT B.서비스ID, A.서비스명, A.서비스URL
        FROM 서비스 A
          LEFT OUTER JOIN 서비스이용 B
                                    ON(A.서비스ID = B.서비스ID)
      WHERE B.서비스ID IS NULL
      GROUP BY B.서비스ID, A.서비스명, A.서비스URL;


 SELECT A.서비스ID, A.서비스명, A.서비스URL
        FROM 서비스 A
     WHERE 서비스ID IN (SELECT 서비스ID
                                            FROM 서비스이용
                                           MINUS
                                         SELECT 서비스ID
                                            FROM 서비스);


풀이



93) 아래와 같이 일자별매출 테이블이 존재할 때 아래 결과처럼 일자별 누적매출액을 SQL로 구하려고 한다.
WINDOW FUNCTION을 사용하지 않고 일자별 누적매출액을 구하는 SQL로 옳은 것은?


SELECT A.일자, SUM(A.매출액) AS 누적매출액
        FROM 일자별매출 A
      GROUP BY A.일자
      ORDER BY A.일자;


SELECT B.일자, SUM(B.매출액) AS 누적매출액
FROM 일자별매출 A JOIN 일자별매출 B ON (A.일자 >= B.일자)
GROUP BY B.일자
ORDER BY B.일자;




SELECT A.일자, SUM(B.매출액) AS 누적매출액
FROM 일자별매출 A JOIN 일자별매출 B ON (A.일자 >= B.일자)
GROUP BY A.일자
ORDER BY A.일자;




SELECT A.일자
, SELECT
SUM(B.매출액)
FROM 일자별매출 A JOIN 일자별매출 B ON (A.일자 >= B.일자) AS 누적매출액
FROM 일자별매출 A
GROUP BY A.일자
ORDER BY A.일자;
 


 
101) 아래와 같인 데이터 모델에서 평가대상상품에 대한 품질평가항목별 최종 평가 결과를 추출하는 SQL문장으로 옳은 것은?
(단, 평가항목에 대한 평가(평가등급)가 기대수준에 미치지 못할 경우 해당 평가항목에 대해서만 재평가를 수행한다.)




① SELECT B.상품ID, B.상품명, C.평가항목ID, C.평가항목명, A.평가회차, A.평가등급, A.평가일자
        FROM 평가결과 A, 평가대상상품 B, 품질평가항목 C

                 , (SELECT MAX(평가회차) AS 평가회차 FROM 평가결과) D
     WHERE A.평가항목ID = C.평가항목ID
           AND A.상품ID = B.상품ID
           AND A.평가회차 = D.평가회차;

SELECT B.상품ID, B.상품명, C.평가항목ID, C.평가항목명, A.평가회차, A.평가등급, A.평가일자
        FROM 평가결과 A, 평가대상상품 B, 품질평가항목 C
     WHERE A.상품ID = B.상품ID
           AND A.평가항목ID = C.평가항목ID
           AND A.평가회차 = (SELECT MAX(X.평가회차)
                                              FROM 평가결과 X
                                           WHERE X.상품ID = B.상품ID
                                                 AND X.평가항목ID = C.평가항목ID;


SELECT B.상품ID, B.상품명, C.평가항목ID, C.평가항목명
                 , MAX(A.평가회차) AS 평가회차
                 , MAX(A.평가등급) AS 평가등급
                 , MAX(A.평가일자) AS 평가일자
        FROM 평가결과 A, 평가대상상품 B, 품질평가항목 C
     WHERE A.상품ID = B.상품ID
           AND A.평가항목ID = C.평가항목ID
     GROUP BY B.상품ID, B.상품명, C.평가항목ID, C.평가항목명;


SELECT B.상품ID, B.상품명, C.평가항목ID, C.평가항목명, A.평가회차, A.평가등급, A.평가일자
        FROM (SELECT 상품ID, 평가항목ID
                                  , MAX(A.평가회차) AS 평가회차
                                  , MAX(A.평가등급) AS 평가등급
                                  , MAX(A.평가일자) AS 평가일자
                        FROM 평가결과
                      GROUP BY 상품ID, 평가항목ID) A, 평가대상상품 B, 품질평가항목 C
)

     WHERE A.상품ID = B.상품ID
           AND A.평가항목ID = C.평가항목ID;
풀이



102) 아래 부서 테이블의 담당자 변경을 위해 부서임시 테이블에 입력된 데이터를 활용하여 주기적으로 부서 테이블을 아래 결과와 같이 반영하기 위한 SQL으로 가장 적절한 것은? (단, 부서임시 테이블에서 변경일자를 기준으로 가장 최근에 변경된 데이터를 기준으로 부서 테이블에 반영되어야 한다.)
>
① UPDATE 부서 A SET 담당자 = (SELECT C.부서코드
                                                           FROM 부서임시 (SELECT 부서코드, MAX(변경일자 AS 변경일자
                                                                                           FROM 부서임시
                                                                                        GROUP BY 부서코드) B, 부서임시 C
                                                        WHERE B.부서코드 = C.부서코드
                                                              AND B.변경일자 = C.변경일자
                                                              AND A.부서코드 = C.부서코드)


② UPDATE 부서 A SET 담당자 = (SELECT C.부서코드
                                                           FROM 부서임시 (SELECT 부서코드, MAX(변경일자 AS 변경일자
                                                                                           FROM 부서임시
                                                                                        GROUP BY 부서코드) B, 부서임시 C
                                                        WHERE B.부서코드 = C.부서코드
                                                              AND B.변경일자 = C.변경일자
                                                              AND A.부서코드 = C.부서코드)
     WHERE EXISTS (SELECT 1 FROM 부서 X WHERE A.부서코드 = X.부서코드);


③ UPDATE 부서 A SET 담당자 = (SELECT B.담당자
                                                           FROM 부서임시 B, 부서임시 C
                                                        WHERE B.부서코드 = C.부서코드
                                                              AND B.변경일자 = (SELECT MAX(C.변경일자)
                                                                                                 FROM 부서임시 C
                                                                                              WHERE C.부서코드 = B.부서코드)
)
     WHERE 부서코드 IN (SELECT 부서코드 FROM 부서임시);


④ UPDATE 부서 A SET 담당자 = (SELECT C.부서코드
                                                           FROM 부서임시
                                                        WHERE B.부서코드 = C.부서코드
                                                              AND B.변경일자 = '2015.01.25'
);

풀이



728x90
반응형