[SQL-Abfrage] Spalten gegebenfalls hinzufügen



  • Hi,

    ich habe ne SQL-Abfrage die mir sowas zurückgibt.

    Beispiel:

    Name    Vorname    Sonstiges
    -----------------------------
    Lulu    Haha       TV
    Lulu    Haha       PC
    

    Wir ihr sehen könnt bekomme ich bei meiner Abfrage 2 Mal die selbe Person und jeweils eine anderes SONSTIGES (Info: n-zu-n Beziehung)

    Nun will ich aber das sowas rauskommt:

    Name    Vorname    Sonstiges1    Sonstiges2
    -------------------------------------------
    Lulu    Haha       TV            PC
    

    Wie stelle ich das an. Ich weiß das es irgendwas dafür gab 🙄

    Edit: Das gegebenfalls könnt in Titel könnt ihr vergessen 😉 Ich bekomme immer genau 4 Zeilen zurück d.h. ich brauche 4 Spalten "Sonstiges"



  • Das geht IMHO nicht.



  • Name    Vorname    Sonstiges    Wert
    --------------------------------------
    Lulu    Haha       TV           Pro7
    Lulu    Haha       PC           C++
    

    So isses genauer.

    Ich bekomme ja jetzt das obige zurück. Dadrauf kann ich ja nochmal nen Select machen und dann angeben where Sonstiges like 'TV'.
    Dann gibt es doch sowas wie UNION. Kann ich damit dann nicht nochmal where sontiges like 'PC'.

    Und dann anzeigen lassen.
    Ist Union nicht dazu da um sowas zu machen ???



  • Na ja, vielleicht in der Richtung:

    SELECT
    x.Name,
    x.Vorname,
    y1.Feld AS Sonstiges1,
    y2.Feld AS Sonstiges2
    FROM Tabelle1 x, Tebelle2 y1, Tabelle2 y2
    WHERE (...)
    

    Das geht zumindest, wenn die Anzahl der Spalten fest vorgeben ist.
    Wenn eine der Sonstiges-Spalten leer sein kann, mußt Du die Tabellenverknüpfung über LEFT-JOINS machen.



  • Union fügt an ein ROWSET ein weiteres ROWSET der 2ten SELECT (UNION SELECT) an.
    Union geht davon aus das die Annzahl der Spalten gleich sind.

    Wo liegt das Problem mit den Daten dann eine Logic aufzubauen. Dh. die Daten dann so auszugeben wie du sie willst.



  • Soo 😃
    Der folgende Link beschrieb genau mein Problem:
    http://www.itrain.de/knowhow/sql/tsql/pivot/pivot.asp

    Habe es an meiner Tabell angewandt und bekomme nun dieses Erbenis:

    Name    Vorname    TV     PC
    --------------------------------------
    Lulu    Haha       Pro7   Null
    Lulu    Haha       Null   C++
    

    Das ist eigentlich genau das was ich wollte. Nun muss ich aber die 2 Zeilen überlagern. Wie krieg ich das hin. Gruppieren kann ich sie ja nicht, weil ich keine Aggregatfunktionen drin habe.



  • Poste doch einfach mal den SELECT dazu. Du weißt wie er aussieht, wir nicht, also können wir Dir auch nicht sagenl, was Du ändern mußt...



  • Du wolltest es ja so:

    Das oben war ja nur nen Beispiel so siehts in Wirklickkeit aus:

    SELECT     Studie, Studientag, Proband, Datum, Uhrzeit, (CASE [Parameter] WHEN 'Gewicht' THEN Wert END) AS Gewicht, 
                          (CASE [Parameter] WHEN 'Initials' THEN Wert END) AS Initials
    FROM         (SELECT     dbo.Study.Study_Title AS Studie, dbo.[Study Day].[Study Day Name] AS Studientag, 
                                                  dbo.[Test Subject].[Test Subject_Study Subject Code] AS Proband, dbo.[Study Day].[Study Day Date] AS Datum, 
                                                  dbo.[Study Day].[Study Day Date] AS Uhrzeit, dbo.Parameter.Parameter_Name AS Parameter, 
                                                  dbo.Study_Data.Study_Data_Value AS Wert
                           FROM          dbo.Activity INNER JOIN
                                                  dbo.[Rel_Activity_Study Data] ON dbo.Activity.Activity_ID = dbo.[Rel_Activity_Study Data].[Related Activity_ID] INNER JOIN
                                                  dbo.[Study Day] ON dbo.Activity.[Related Study Day_ID] = dbo.[Study Day].[Study Day ID] INNER JOIN
                                                  dbo.Study_Data ON dbo.[Rel_Activity_Study Data].[Related Study Data_ID] = dbo.Study_Data.Study_Data_ID INNER JOIN
                                                  dbo.Parameter ON dbo.Study_Data.Related_Parameter_ID = dbo.Parameter.Parameter_ID INNER JOIN
                                                  dbo.[Test Subject] ON dbo.[Study Day].[Related Test Subject_ID] = dbo.[Test Subject].[Test Subject_ID] INNER JOIN
                                                  dbo.Study ON dbo.[Test Subject].[Related Study_ID] = dbo.Study.Study_ID
                           WHERE      (dbo.Study.Study_Title = N'blk3') AND (dbo.Activity.Activity_Name = N'Test')) AS derivedtbl_1
    


  • Nochmal ohne die ganze innere Verschachtlung:

    SELECT     Studie, Studientag, Proband, Datum, Uhrzeit, (CASE [Parameter] WHEN 'Gewicht' THEN Wert END) AS Gewicht, 
                          (CASE [Parameter] WHEN 'Initials' THEN Wert END) AS Initials
    FROM derivedtbl_1
    

    Bezug zu meinem Beispiel:
    -------------------------
    Parameter -> Sonstiges
    Gewicht -> TV
    Initials -> PC



  • Hast Du schon versucht eine GROUP BY-Klausel zu verwenden?



  • Ja wenn ich ein Group by Datum anhänge dann kommt ne Fehlermeldung:

    "Die Studie-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in einer Group by-Klausel ist."

    Dann tue ich sie halt mit in die Klausel und dann will er das Studientag drin steht.
    Das geht dann so weiter...

    Wenn ich dann alle drin habe kommt dieser Fehler:

    "Die Datentypen 'text', 'ntext' und 'image' können nur mithilfe des Operators IS NULL oder LIKE verlichen oder sortiert werden"

    😕 😕



  • Ich kann das selbe Ergnis jetzt auch mit UNION erziehlen, also ohne die CASE Geschichte.

    Trotzdem muss ich immer noch diese Zeilen zusammen bekommen 😞



  • Im "Group by" müssen ALLE Spalten, die Du abfragst und kein Aggregat sind, aufgezählt werden.

    Bau bei den Case-Anweisungen am Ende ein AS 'Spaltenname' als Namensgeber ein und dann funzt die "Überlagerung" der Datensätze auch.



  • Danke für die Antwort, ist aber nicht mehr nötig 😉
    Muss das ganze jetzt ehe anders machen und mein Webdienst verarbeitet die Daten dann für mich...


Anmelden zum Antworten