2017-12-03 13 views
0

SQLite 데이터베이스에 정보가 있습니다. 데이터베이스 구조는 변경할 수 없습니다.하위 문자열 : 필드 이름에 행 정보

Illustration

내가 나에게 TypeOfInformation 항목 필드의 이름입니다있는 결과를 줄 것이다 쿼리 구성하기 위해 노력하고 있습니다 :

내 첫 번째 시도는 하위 쿼리와 함께 작동하도록했다 Illustration

:

SELECT (SELECT Value FROM FinData WHERE Type = 'Price') AS Price, 
     (SELECT Value FROM FinData WHERE Type = 'Volume') AS Volume 
FROM FinData") 

그러나 완벽하게 보였으 나 결과는 콜럼의 모든 항목 MNS PriceVolume는 원본 데이터베이스에서 PriceVolume의 FIRST 각각의 항목과 동일하다 :

Illustration

내가이 문제를 얻기 위해 다른 가격 및 볼륨 정보를 포함하도록 시도 -하지만 난 실패했습니다. (. 구문이 이해하기 다소 쉬웠 때문에 어떤이 유감이다)

다음 시도는 다음이었다

이 나에게 볼륨 열 및 모든 볼륨 정보를 가진 결과 집합을 제공
Select Date, Value AS Volume From FinData WHERE Volume IN 
(SELECT Value FROM FinData WHERE (Type = 'Volume')) 

. 좋아, 지금까지. 내가

Select Date, Value AS Volume From FinData WHERE Volume IN 
(SELECT Value FROM FinData WHERE (Type = 'Volume')) 
union 
Select Date, Value AS Close From FinData WHERE Price IN 
(SELECT Value FROM FinData WHERE (Type = 'Price')) 

을 통해이 결과 집합 가격 열을 보충 할 때, 그래서 저는 또한 쓸모가 하나의 컬럼 만 ("볼륨")에서 가격 및 볼륨 정보를 표시하는 결과 집합을 얻을.

답변

0

가정 날짜 가격 볼륨 쌍 당 고유,이 작업을 수행 할 수 있습니다

with xxx(date,price,volume) as 
    (
    select date,value,0 from findata where typeofinformation = 'Price' 
    union 
    select date,0,value from findata where typeofinformation = 'Volume' 
) 
    select date,sum(price) price,sum(volume) volume from xxx group by date; 
+0

덕분에 너무 많은,하지만 내 SQLite는 브라우저에서 코드를 붙여 넣은 데, 그것은 나에게 오류를 제공합니다. – WiWi

+1

@WiWi 오류 메시지를 비밀로 유지 해주셔서 대단히 감사합니다. –

1

가 외부 쿼리의 행에 대응하는 값을 찾으려면, 당신은 명시 적으로를 만드는 correlated subquery을 사용해야합니다 둘 사이의 접속하십시오 DA 용

SELECT Date, 
     (SELECT Value 
     FROM FinData 
     WHERE Date = Dates.Date 
      AND TypeOfInformation = 'Price' 
     ) AS Price, 
     (SELECT Value 
     FROM FinData 
     WHERE Date = Dates.Date 
      AND TypeOfInformation = 'Volume' 
     ) AS Volume 
FROM (SELECT DISTINCT Date 
     FROM FinData) AS Dates; 

(. 고유 부질 각 날짜에 대해 복수의 열을 방지하기 위해 사용된다)

대안

, 그룹의 모든 행 테를 사용 집계 함수와 CASE expressions와 적절한 행에서 값을 추출 :

SELECT Date, 
     MAX(CASE WHEN TypeOfInformation = 'Price' THEN Value END) AS Price, 
     MAX(CASE WHEN TypeOfInformation = 'Volume' THEN Value END) AS Volume 
FROM FinData 
GROUP BY Date;