MSSQL GROUP BY als String-Liste



  • Hi,

    in meiner Tabelle habe ich zwei Spalten A und B. A ist immer eindeutig, während ich B nutze, um die Einträge zu gruppieren.
    Jetzt möchte ich einen Query schreiben, der mit alle Gruppen (also Bs) ausgibt und eine zweite Spalte mit einer Komma-getrennten Liste erzeugt, in der alle zugehörigen As stehen. In etwa so:

    A | B      B | A
    --+--  =>  --+-------
    1 | 1      1 | 1,2,3
    2 | 1      2 | 4,5,6
    3 | 1
    4 | 2
    5 | 2
    6 | 2
    

    Ich dachte dabei an GROUP BY, hab aber keine Funktion gefunden, die mir die zweite Spalte erzeugt. Gibt es so eine Funktion in MSSQL oder muss ich mir das von Hand zusammen basteln?



  • Du kannst eine C# Funktion schreiben die das macht, und diese dann einbinden:

    http://msdn.microsoft.com/en-us/library/ms182741.aspx

    Halte ich aber nicht für sinnvoll.
    Wieso machst du es nicht einfach in der Applikation? Es muss nicht immer alles SQL sein...



  • C# is nicht so mein Gebiet 😉
    So würde ich es auch machen, fänd die SQL-Version aber eleganter. Ich lade per SQL eine Lookup-Table für eine datensensitive ComboBox. In dieser sollen aber nur die "B"-Werte angezeigt werden, also darf jeder B-Wert im Resultset nur einmal auftauchen. Als Schlüssel brauch ich aber eine Liste mit zugehörigen "A"-Werten, die ich dann bei jeder Auswahl der ComboBox manuell aus der Datenbank nachladen müsste...



  • heimchen schrieb:

    Als Schlüssel brauch ich aber eine Liste mit zugehörigen "A"-Werten, die ich dann bei jeder Auswahl der ComboBox manuell aus der Datenbank nachladen müsste...

    Hä?
    Verstehe ich nicht.
    Der User wählt in der Combo-Box "1" aus, und du brauchst dann "1, 2, 3" oder wie?

    Dann mach ein SELECT B, A ORDER BY B, mach das GROUP BY selbst applikationsseitig, und schreib für jedes B die passenden A in einer Liste mit.



  • In meinem Programm krieg ich das schon gelöst... 🙂
    Unter VCL kann man bei einer TDBLookupComboBox eine ListSource (TDataSource), ListField und KeyField angeben. ListField ist das Feld der Datenmenge, das in der ComboBox angezeigt wird, KeyField ist das Feld, dessen Wert bei entsprechender auswahl als Key verwendet wird (zum Beispiel als Eingabe in einer zweiten Datenmenge). Könnte ich mein Problem in SQL lösen, bräuchte ich darum keinen Code mehr, weil die Bordmittel schon alle Funktionen haben...



  • Also quasi "wieso kompliziert wenns auch einfach geht". Verstehe ich soweit.
    Geht aber in diesem Fall nicht 🙂

    BTW: je mehr non-Standard SQL Features du verwendest, desto mehr machst du dich von MS-SQL Server abhängig. Nur für den Fall dass bei deinem Projekt wichtig werden könnte dass auch andere Datenbanken unterstützt werden. In so einem Fall ist dann sowieso angesagt viele Dinge in der Applikation zu machen.



  • hustbaer schrieb:

    Also quasi "wieso kompliziert wenns auch einfach geht". Verstehe ich soweit.

    Das war der Gedanke 🙂

    hustbaer schrieb:

    Geht aber in diesem Fall nicht 🙂

    Das ist doof.

    hustbaer schrieb:

    BTW: je mehr non-Standard SQL Features du verwendest, desto mehr machst du dich von MS-SQL Server abhängig. Nur für den Fall dass bei deinem Projekt wichtig werden könnte dass auch andere Datenbanken unterstützt werden. In so einem Fall ist dann sowieso angesagt viele Dinge in der Applikation zu machen.

    Ja, das ist ein Problem von dem ich hoffe, dass es so schnell nicht kommt... 🕶



  • vll hilfts: http://stackoverflow.com/questions/122942/how-to-return-multiple-values-in-one-column-t-sql

    wobei das hässlich genug ist, eine applikationsseitige Lösung ebenfalls in Erwägung zu ziehen



  • zwutz schrieb:

    vll hilfts: http://stackoverflow.com/questions/122942/how-to-return-multiple-values-in-one-column-t-sql

    wobei das hässlich genug ist, eine applikationsseitige Lösung ebenfalls in Erwägung zu ziehen

    Ja, diese Variante hab ich im Zusammenhang mit einem anderen Problem (PIVOT .. IN ..) gefunden, find ich aber gar nicht schön 🙂


Anmelden zum Antworten