2016-06-07 5 views
3

저는 Oracle Database 12c Enterprise Edition을 사용하고 있습니다.BETWEEN 연산자를 사용하여 두 SELECT 하위 쿼리를 비교하는 방법은 무엇입니까?

표는 다음과 같습니다 http://i.stack.imgur.com/gL2L6.jpg

이 표는 자신의 고유 한 ID (WKN), 자신의 시작 가격 (시작), 최대 가격 (호크), 낮은 가격으로 다른 주식의 주가를 (보여줍니다 Tief)와 그들의 마감 가격 (Schluss)을 날짜별로 (Datum) 표시합니다. 이제 SQL에서 90 일 선을 직접 계산하려고합니다. 90 일 이내에 지난 90 일 동안 종가의 산술 평균을 계산하여 매일 계산합니다.

나는 다음과 같은 SQL 문이를 계산하기 위해 노력 : http://i.stack.imgur.com/XjYXf.jpg

모두 첫 번째 하위 쿼리 :

SELECT SUM(SCHLUSSPREIS)/90 AS TAGESLINIE FROM KURS WHERE DATUM BETWEEN 
    (SELECT DATUM FROM KURS WHERE WKN = 2 AND DATUM BETWEEN 
    (SELECT MAX(DATUM) - 179 FROM KURS) AND 
    (SELECT MAX(DATUM) - 90 FROM KURS) ORDER BY DATUM ASC) 
    AND (SELECT DATUM FROM KURS WHERE WKN = 2 AND DATUM BETWEEN 
    (SELECT MAX(DATUM) - 89 FROM KURS) AND 
    (SELECT MAX(DATUM) FROM KURS) ORDER BY DATUM ASC) 
; 

당신이 혼란 문의 더 나은 개요를 제공하기 위해, 나는 다음과 같은 구조를 만들어 ...

(SELECT DATUM FROM KURS WHERE WKN = 2 AND DATUM BETWEEN 
    (SELECT MAX(DATUM) - 179 FROM KURS) AND 
    (SELECT MAX(DATUM) - 90 FROM KURS) ORDER BY DATUM ASC) 

... 및 제 부질 ...

(SELECT DATUM FROM KURS WHERE WKN = 2 AND DATUM BETWEEN 
    (SELECT MAX(DATUM) - 89 FROM KURS) AND 
    (SELECT MAX(DATUM) FROM KURS) ORDER BY DATUM ASC) 

... 같은 기간 (90)의 목록을 반환합니다.

첫 번째 하위 쿼리 목록에서 첫 번째 날짜는 두 번째 하위 쿼리 목록에 속하며 첫 번째 하위 쿼리 목록의 두 번째 날짜는 두 번째 하위 쿼리 목록의 두 번째 날짜에 속하며, 등 (구성표 도형). 이제는 내 SQL 문이 각 기간 (첫 번째 날짜 (목록 1)부터 첫 번째 날짜 (목록 2)까지)의 모든 마감 가격을 합한 다음 90으로 나누어 산술 평균을 구하고 두 목록 비어 있습니다.

ERROR at line 1: 
ORA-00907: missing right parenthesis 

또는

ERROR at line 1: 
ORA-01427: single row subquery returns more than one row 

어떤 생각이 어떻게 SQL이 직접 같은 것을 할 : 나는 이것을 실행하면

그러나, 나는 다음과 같은 오류 메시지가?

도움이 감사합니다. - 감사합니다! :-)

+0

연구를'JOIN'이 무엇 : https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries006.htm – Nicarus

+0

당신은 할 수 90 일 평균을 계산하는 SQL 함수를 작성하십시오. 매개 변수로 WKN 및 종료 날짜를 허용하고 평균을 반환합니다. 이 쿼리를 메인 쿼리와 별도로 테스트하여 작동 시키십시오. 그런 다음 주요 SQL select에서이 함수를 호출합니다. –

+1

대학을 위해서이 작업을 수행해야하며 사용자 정의 SQL 함수를 사용할 수 없습니다. join과 coalesce() 함수로 해결하려고 노력할 것이다. – Lonkey

답변

1

SUM은 SQL에서 사용할 수있는 유일한 집계 함수가 아닙니다. 여기 대신 AVG을 사용할 수 있습니다 :

SELECT * 
FROM (
    SELECT 
    DATUM, 
    AVG(SCHLUSSPREIS) OVER (ORDER BY DATUM rows BETWEEN 89 PRECEDING AND CURRENT ROW) AS TAGESLINIE 
    FROM KURS 
    WHERE WKN = 2 
    ORDER BY DATUM DESC 
) Moving_Average 
WHERE ROWNUM <= 90; 
+0

팁 주셔서 감사하지만 실제로 내 문제가 아니에요. 문제는 BETWEEN 문 사이에 [this] (http://i.stack.imgur.com/XjYXf.jpg)와 같은 날짜 목록을 다시 표시하는 두 개의 하위 쿼리가 있다는 것입니다. 이제는 BETWEEN 문을 사용하여 첫 번째 목록의 각 날짜와 두 번째 목록의 날짜를 비교하여 순서의 동일한 위치를 비교하기를 원합니다.그러나 오류 메시지 (단일 행 하위 쿼리는 둘 이상의 행을 반환합니다) 때문에이 사이에 가능하지 않습니다 생각합니다. 그래서 사용자 정의 된 SQL 함수없이 이와 같은 작업을 수행하는 방법은 무엇입니까? – Lonkey

+0

그 : [오라클 이동 평균] (http://stackoverflow.com/a/22166986/5690722) 종을 울리시겠습니까? –

+0

나는 내 문제가 조금 혼란 스럽다는 것을 인정한다. 나는이 주식의 현재 가장 사용 가능한 날짜부터 시작하여 SQL이 certian 주식으로부터 90 일간의 주가를 계산하기를 원합니다. 그래서 MAX (DATUM)을 사용합니다. 그러나이를 위해서는 90 일 이내에 지난 90 일 동안 종가의 산술 평균을 결정해야합니다. 따라서 결국에는 90 가지 다른 산술 수단을 사용해야합니다. MAX (DATUM)가 31-DEC-15라고 가정 해 보겠습니다. 그런 다음 첫 번째 산술 평균은 MAX (DATUM) - 89와 MAX (DATUM) 사이의 모든 마감 가격에서 계산됩니다. [다음 주석에 계속] – Lonkey