2017-12-03 16 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')) 

を経由してこのResultSet Price列を補完したい場合しかし、私は、そのためにも役に立たないだけONE列(「音量」)、中価格とボリューム情報を示して結果セットを取得します。

答えて

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; 

(DISTINCTサブクエリは、各日付の複数の行を防止するために使用される。)あるいは

、グループのすべての行:両方との間の接続TE、および適切な行から値を抽出するために、集計関数と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; 
関連する問題