2016-12-10 5 views
0

보조 테이블에 데이터를 삽입하려고하는데 새 테이블에 롤링 닫기 값을 계산하고 삽입하려면 하위 쿼리가 필요합니다.INSERT 하위 쿼리의 MySQL 구문 오류

  1. 어느 값의 수를 일치하지 않는 열 수, 또는
  2. 구문 오류가

내가 대상 테이블 있음을 확인했다 : 나는 쿼리를 시도 할 때, 나는 두 가지 오류 중 하나를 얻고있다 insert 문에서 참조되는 모든 열을가집니다. 어떤 도움을 주시면 감사하겠습니다.

INSERT INTO `Historical`.`Secondary`(
`Record`, 
    `Symbol`, 
    `Date`, 
    `Open`, 
    `High`, 
    `Low`, 
    `Close`, 
    `Volume`, 
    `Rolling_Close`) 

SELECT 
T1.Date, T1.Symbol, T1.Close, 

(
SELECT AVG(T2.Close) 

FROM Historical.Primary T2 

WHERE T1.Symbol = T2.Symbol 

AND T2.Date BETWEEN DATE_SUB(T1.Date, INTERVAL 30 DAY) 

AND DATE_SUB(T1.Date, INTERVAL 1 DAY)) AS Rolling_Close 

FROM Historical.Primary T1 

GROUP BY T1.Date, 

T1.Symbol; 

테이블 Historical.Secondary에는 다음과 같은 열이 있습니다,

Rolling_Close

기록, 기호, 날짜, 열기, 고, 저, 닫기, 볼륨 표 Historical.Primary은 다음이를 열 :

기록, 기호, 날짜, 열기, 고, 저, 닫기, 볼륨

+1

1 생산 - 당신이 (삽입 정의한 같은 수의 필드를 선택해야하고 그들은 같은에 있어야 순서 및 올바른 유형), 2- 당신은에서 매달려있다. 3 - 브래킷 4 빠진 것 기타 샘플 데이터를 게시 할 수 있습니까? –

+0

1. 9 개의 각 열에 Historical.Secondary에서 사용 가능한 대상 열이 있는지 확인하고 올바른 순서로 이름이 일치하는지 확인했습니다. 2. FROM이 무엇을 의미하는지 모르겠습니다. 그 점을 이해하는 데 도움이되고 해결하기 위해 어떤 단계를 취할 수 있습니까? 쿼리가 실행되지 않으므로 모든 열에 NULL이 표시되므로 게시해야하는 샘플 데이터 유형을 알 수 없습니다. 지금까지 도움을 주셔서 감사합니다. 근본 원인을 돕기 위해 내가 무엇을 제공 할 수 있는지 알려주세요. 나는 아주 새롭다, 그래서 나는 끈기를 평가한다. – Hogateer

+0

9 개의 열을 삽입하고 4 개만 선택했습니다. 2 차적 요소에 관해 혼란 스럽습니다. 기호 내에 날짜가있는 것 같지만 쿼리가 기호 내에있는 것 같습니다. 보조 항목을 사용하여 달성하려는 내용을 명확히 할 수 있습니까? –

답변

0

당신에게 테이블과 데이터를 가정이

유사
drop table if exists secondary; 
create table secondary (record int auto_increment primary key,symbol int,dt date,open int, high int, low int,close int,volume int, rolling_close decimal(10,2)); 

drop table if exists prmary; 
create table prmary (record int auto_increment primary key,symbol int,dt date,open int, high int, low int,close int,volume int); 

alter table prmary 
    add key k001(symbol,dt); 

MariaDB [sandbox]> select * from prmary order by symbol,record; 
+--------+--------+------------+------+------+------+-------+--------+ 
| record | symbol | dt   | open | high | low | close | volume | 
+--------+--------+------------+------+------+------+-------+--------+ 
|  1 | 707 | 2007-08-01 | NULL | NULL | NULL | 242 | NULL | 
|  3 | 707 | 2007-08-02 | NULL | NULL | NULL |  7 | NULL | 
|  5 | 707 | 2007-08-03 | NULL | NULL | NULL |  4 | NULL | 
|  7 | 707 | 2007-08-04 | NULL | NULL | NULL |  2 | NULL | 
|  2 | 712 | 2007-08-01 | NULL | NULL | NULL | 415 | NULL | 
|  4 | 712 | 2007-08-02 | NULL | NULL | NULL |  4 | NULL | 
|  6 | 712 | 2007-08-03 | NULL | NULL | NULL |  7 | NULL | 
|  8 | 712 | 2007-08-04 | NULL | NULL | NULL |  5 | NULL | 
+--------+--------+------------+------+------+------+-------+--------+ 
8 rows in set (0.00 sec) 

이 쿼리

truncate table secondary; 
insert into secondary 
(`Record`, `Symbol`, `Dt`,`Open`, `High`, `Low`,`Close`,`Volume`,`Rolling_Close` 
) 
SELECT record,T1.Symbol, T1.Dt,open, high, low,t1.close,volume, 
(
SELECT avg(t2.close) 
FROM Prmary T2 
WHERE T1.Symbol = T2.Symbol 
AND T2.Dt BETWEEN DATE_SUB(T1.Dt, INTERVAL 30 day) 
AND DATE_SUB(T1.Dt, INTERVAL 0 day) 
) AS Rolling_Close 
FROM Prmary T1 
GROUP BY t1.symbol,t1.dt; 

이 결과

MariaDB [sandbox]> select * from secondary order by symbol, record; 
+--------+--------+------------+------+------+------+-------+--------+---------------+ 
| record | symbol | dt   | open | high | low | close | volume | rolling_close | 
+--------+--------+------------+------+------+------+-------+--------+---------------+ 
|  1 | 707 | 2007-08-01 | NULL | NULL | NULL | 242 | NULL |  242.00 | 
|  3 | 707 | 2007-08-02 | NULL | NULL | NULL |  7 | NULL |  124.50 | 
|  5 | 707 | 2007-08-03 | NULL | NULL | NULL |  4 | NULL |   84.33 | 
|  7 | 707 | 2007-08-04 | NULL | NULL | NULL |  2 | NULL |   63.75 | 
|  2 | 712 | 2007-08-01 | NULL | NULL | NULL | 415 | NULL |  415.00 | 
|  4 | 712 | 2007-08-02 | NULL | NULL | NULL |  4 | NULL |  209.50 | 
|  6 | 712 | 2007-08-03 | NULL | NULL | NULL |  7 | NULL |  142.00 | 
|  8 | 712 | 2007-08-04 | NULL | NULL | NULL |  5 | NULL |  107.75 | 
+--------+--------+------------+------+------+------+-------+--------+---------------+ 
8 rows in set (0.00 sec)