2017-12-03 1 views
0

Ich habe Informationen in einer SQLite-Datenbank. Die Datenbankstruktur kann nicht geändert werden.Teilzeichenfolge: Zeileninformationen zu Feldnamen

Illustration

Ich versuche, eine Abfrage zu erstellen, die mir ein Ergebnis geben wird, in denen die TypeOfInformation Einträge sind Feldnamen:

Illustration

Mein erster Versuch mit Subqueries zu arbeiten, war:

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

schien perfekt, aber das Ergebnis war eine Ergebnismenge, in der jeder Eintrag in der Spalte mns Price und Volume sind gleich dem ersten entsprechenden Eintrag von Price und Volume in der ursprünglichen Datenbank:

Illustration

Ich habe versucht, dies zu umgehen und die andere Preis- und Volumen Informationen enthalten - aber ich gescheitert. (. Welches ist schade, weil die Syntax schien irgendwie leicht zu verstehen)

Nächster Versuch war die folgende:

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

Das gibt mir ein Resultset mit einer Volume-Spalte und alle Volumeninformationen. Gut so weit. Allerdings, wenn ich dieses resultset die eine Preisspalte über

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')) 

ergänzen möchte bekomme ich eine Suchresultates, die Preis- und Volumeninformationen in nur einer Spalte („Volume“) zeigt, die daher auch nutzlos.

Antwort

0

Unter der Annahme, Termine sind einzigartig pro Preisvolumen Paar, Sie können dies tun:

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

Vielen Dank, aber den Code in meinem SQLite Browser eingefügt zu haben, es gibt mir einen Fehler. – WiWi

+1

@WiWi Vielen Dank, dass Sie die Fehlermeldung geheim halten. –

1

Um einen Wert entsprechend einer Zeile in der äußeren Abfrage nachschlagen, müssen Sie eine correlated subquery verwenden, die eine explizit macht Verbindung zwischen beide:

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; 

(. Die DISTINCT Unterabfrage verwendet wird, um mehrere Zeilen für jedes Datum zu verhindern)

Alternativ Gruppe aller Zeilen für ein da te und die Verwendung Aggregationsfunktionen und CASE expressions, um die Werte aus den entsprechenden Zeilen zu extrahieren:

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;