2016-09-13 2 views
0

한 행의 데이터 만 반환해야하는 Oracle 쿼리가 있습니다 (불행히도 DBMS 버전을 알지 못합니다). 또한 단일 SELECT 쿼리 여야하므로 임시 테이블 및 매개 변수 선언은 허용되지 않습니다.CTE를 사용하는 단일 Oracle SQL 쿼리에서 "GROUP BY와 일치하지 않는 SELECT 목록"오류가 발생합니다.

먼저 GROUP BY 조건으로 사용되는 첫 번째 열을 제외한 모든 열의 값을 집계하는 CTE를 사용합니다. 하나의 행에 모든 값을 표시해야합니다. (필터 된 CTE에 3 개의 CROSS JOIN을 사용하고 하나의 행으로 된 세 개의 데이터 집합을 결합하여 한 행의 데이터 집합을 생성합니다).

CTE (전체 CTE가 아닌 SELECT 만)를 실행하면 오류가 발생하지 않습니다. 하지만이 SELECT 문을 WITH ... AS 구문으로 래핑하면 Oracle SQL Developer 오류가 발생합니다.

다음
WITH 
FRUITDATASET AS (
    SELECT 
     -- FROM HERE, ORACLE SQL DEVELOPER MARKS LINES AS ERRONEOUS 
     FRUITTYPE, 
     COUNT(LONDONFRESH) AS LONDONFRESH, 
     COUNT(BERLINFRESH) AS BERLINFRESH, 
     SUM(0) AS LONDONSTALE, 
     SUM(0) AS BERLINSTALE 
     -- FROM HERE, THE QUERY IS VALID AGAIN 
    FROM 
     [...] 
    GROUP BY 
     FRUITTYPE 

    UNION ALL 

    SELECT 
     -- FROM HERE, THE ERROR HAPPENS AGAIN 
     FRUITTYPE, 
     SUM(0) AS LONDONFRESH, 
     SUM(0) AS BERLINFRESH, 
     COUNT(LONDONSTALE) AS LONDONSTALE, 
     COUNT(BERLINSTALE) AS BERLINSTALE 
     -- FROM HERE IT'S OKAY 
    FROM 
     [...] 
    GROUP BY 
     FRUITTYPE 
) 

내가 사용하는 방법 CTE입니다 : 여기

은 CTE입니다 내가 SQL Developer에서 실행할 때

SELECT 
    SUM(APPLES.LONDONFRESH) AS LONDONFRESHAPPLES, 
    SUM(APPLES.BERLINFRESH) AS BERLINFRESHAPPLES, 
    SUM(APPLES.LONDONSTALE) AS LONDONSTALEAPPLES, 
    SUM(APPLES.BERLINSTALE) AS BERLINSTALEAPPLES, 
    SUM(GRAPES.LONDONFRESH) AS LONDONFRESHGRAPES, 
    SUM(GRAPES.BERLINFRESH) AS BERLINFRESHGRAPES, 
    SUM(GRAPES.LONDONSTALE) AS LONDONSTALEGRAPES, 
    SUM(GRAPES.BERLINSTALE) AS BERLINSTALEGRAPES 
FROM 
    DUAL 

    CROSS JOIN FRUITDATASET APPLES 
    ON APPLES.FRUITTYPE = 'APPLE' 

    CROSS JOIN FRUITDATASET GRAPES 
    ON GRAPES.FRUITTYPE = 'GRAPE' 

쿼리 어쨌든 실행하지만 보고서에 넣어 경우 , 예외를 throw합니다. 나는 퍼팅을 시도했다.

NULL AS LONDONFRESH 
[...] 
GROUP BY 
    FRUITTYPE, 
    NULL 

그러나 여전히 작동하지 않는다. 이 쿼리에 어떤 문제가 있는지 알 수 있습니까?

편집 : 나는 아마 분석 함수를 사용하여이 문제를 해결할 생각 : 지금 내가 서버에서이 솔루션을 확인해 드릴 수 없습니다

WITH 
FRUITDATASET AS (
    SELECT 
     * 
    FROM (
     SELECT 
      DISTINCT FRUITTYPE, 
      COUNT(LONDONFRESH) OVER(PARTITION BY FRUITTYPE) AS LONDONFRESH, 
      COUNT(BERLINFRESH) OVER(PARTITION BY FRUITTYPE) AS BERLINFRESH, 
      SUM(NULL) OVER(PARTITION BY FRUITTYPE) AS LONDONSTALE, 
      SUM(NULL) OVER(PARTITION BY FRUITTYPE) AS BERLINSTALE 
     FROM 
      [...] 
    ) 

    UNION ALL 

    SELECT 
     * 
    FROM (
     SELECT 
      DISTINCT FRUITTYPE, 
      SUM(NULL) OVER(PARTITION BY FRUITTYPE) AS LONDONFRESH, 
      SUM(NULL) OVER(PARTITION BY FRUITTYPE) AS BERLINFRESH, 
      COUNT(LONDONSTALE) OVER(PARTITION BY FRUITTYPE) AS LONDONSTALE, 
      COUNT(BERLINSTALE) OVER(PARTITION BY FRUITTYPE) AS BERLINSTALE 
     FROM 
      [...] 
    ) 
) 

을, 그러나 나는 즉시 답변을 게시합니다 내가 알기 엔.

+0

예외는 무엇입니까? 누가 예외를 던집니까? –

+0

@SamuelRenold 보고서 엔진이 단일 그룹 그룹 함수 java.sql.SQLSyntaxErrorException이 아닌 ORA-00973을 발생시킵니다. – ProminentPotato

답변

0

분명히 CTE를 SELECT * FROM에 넣으면 트릭을합니다. 모든 것이 지금 작동 중입니다.