2012-03-27 5 views
1

Ich habe keine Kontrolle darüber, wie die Daten in dieser Tabelle gespeichert werden. Allerdings muss ich die Tabelle abfragen und die Daten für ähnliche pn_id Spalte als eine Zeile/Datensatz kombinieren.Abfrage - Zeile basierte Tabelle

Zum Beispiel Struktur aktuellen Daten ist wie folgt,

enter image description here

Hier haben wir gleiche pn_id mit anderen Frage ids wiederholt. Dies sollte wirklich als eine pn_id und dann jede Frage als separate Spalte gespeichert werden, meiner Meinung nach. Allerdings habe ich wie folgt dies die folgenden Daten als einen Datensatz abzurufen ..

enter image description here

Jede Idee, wie dies getan werden kann?

Dank

+0

Wenn Sybase die Pivotisierungsoperation does unterstützen, ich würde es nur um mich # in C-Code. Es ist nicht so komplex. – phoog

+0

in den Daten, die Sie zeigen, jede pn_id hat seine eigenen Frage_IDs, gibt es irgendeine Beziehung zwischen Frage_ID 152 (zum Beispiel) und jeder anderen Frage? Oder wenn es 300 verschiedene Frage_IDs gibt, wollen Sie 300 Spalten für jede Zeile, mit Nullen, wenn eine gegebene PN_ID diese Frage ID nicht hat? Sie können mit der CASE-Anweisung ohne ein PIVOT-Schlüsselwort in einer beliebigen SQL-Anweisung pivotieren. –

+0

Ja Ich möchte 300 Spalten mit Nullwerten haben, da ich die Datensätze aus dieser Tabelle mit anderen Tabellen verknüpfen möchte, die Daten in Spalten enthalten, und sie als einen Datensatz in der C# -Datagridansicht anzeigen. Ich werde in diesem Fall die Verwendung der CASE-Anweisung überprüfen. Aber bis jetzt fand diese Verbindung, die anfänglich scheint, sollte das Problem lösen .. aber wird später noch etwas Zeit darauf verbringen. http://groups.google.com/group/sybase.public.sqlanywhere.general/browse_thread/thread/81792ce38b3817e2?pli=1 – MStp

Antwort

2

Hier ist ein Pseudocode für den Transformationsalgorithmus. Beachten Sie, dass Sie den gesamten Datensatz zweimal scannen müssen. Es gibt einige andere Möglichkeiten, die Effizienz zu verbessern, zum Beispiel, wenn die Eingabedaten sortiert werden können. Da es Pseudocode ist, habe ich auch keine Behandlung für Nullwerte hinzugefügt.

var columnNames = new HashSet<string> { "pn_id" }; 

foreach (var record in data) 
    columnNames.Add(record.question_id.ToString()); 

var table = new DataTable(); 
foreach (var name in columnNames) 
    table.Columns.Add(new DataColumn(name, typeof(string))); 

foreach (var record in data) 
{ 
    var targetRecord = CreateNewOrGetExistingRecord(table, record.pn_id); 
    targetRecord[record.question_id.ToString()] = record.char_value ?? record.date_value.ToString(); 
} 

Und hier ist eine Skizze der Hilfsmethode:

DataRow CreateNewOrGetExistingRecord(DataTable table, object primaryKeyValue) 
{ 
    var result = table.Find(primaryKeyValue); 
    if (result != null) 
     return result; 

    //add code here to create a new row, add it to the table, and return it to the caller 
} 
+0

Danke für den Austausch Ich bin jetzt dabei. – MStp

2

die Struktur ist in Ordnung. Wäre es nicht sinnvoll, eine Spalte pro Frage zu haben, weil Sie jedes Mal, wenn eine neue Frage hinzugefügt wird, eine neue Spalte hinzufügen müssen.

Ihr Problem kann leicht mit PIVOT gelöst werden. Werfen Sie einen Blick auf this Link zur Erklärung

+0

Ich glaube nicht, dass PIVOT in Sybase unterstützt wird – Ben

+0

Nur um die DB zu klären, ist Sybase SQL Anywhere 9.01 (ASA 9.01) – MStp