Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL-Abfrage: Ansatz gesucht (https://www.delphipraxis.net/188399-sql-abfrage-ansatz-gesucht.html)

Berni68 28. Feb 2016 13:36

Datenbank: Firebird • Version: 2,5 • Zugriff über: IBDAC

SQL-Abfrage: Ansatz gesucht
 
Hallo,
nach längerer Programmierpause beschäftigt mich ein SQL-Problem bei dem ich nicht weiß wie ich es angehen soll:

In einer Projektcheckliste sollen Merkmalswerte eines oder mehrerer Objekte gespeichert werden.

Die Tabelle könnte so aussehen:

bezug___objekt__merkmal_wert
----------------------------
4711____1_______a_______x1
4711____1_______b_______y1
4711____1_______c_______z1

4711____2_______a_______x2
4711____2_______b_______y2
4711____2_______c_______z2
4711____2_______d_______zz2

4711____3_______b_______y3
4711____3_______c_______z3

Das Abfrageergebnis soll so aussehen:

bezug merkmal werte_der_objekte
----------------------------------
4711____a_______x1______x2
4711____b_______y1______y2______y3
4711____c_______z1______z2______z3
4711____d_______________zz2

Jetzt das Problem:
Die Anzahl der Objekte pro bezug liegt zwischen 1 und 6 (also variable Spaltenzahl)
die Anzahl der Merkmale zwischen 20 und 40.
Nicht jedes Objekt muss alle Merkmale enthalten.

Kann man das in einer einzelnen Abfrage darstellen?

jobo 28. Feb 2016 14:42

AW: SQL-Abfrage: Ansatz gesucht
 
Das wäre eine Pivotabfrage, geht mit FB noch nicht.
Wenn die Anzahl der Merkmale bzw. zusätzlichen Spalten statisch ist, dann kann man das mit Case When prüfen (Datensatz vorhanden/bestimmter Inhalt gesetzt?) und als virtuelle Spalten ausgeben.

hoika 1. Mär 2016 04:49

AW: SQL-Abfrage: Ansatz gesucht
 
Hallo,
geht schon, mit einer Stored Procedure.


Heiko

mkinzler 1. Mär 2016 06:04

AW: SQL-Abfrage: Ansatz gesucht
 
Aber auch nur wenn die Anzahl der Spalten bekannt ist

hoika 1. Mär 2016 06:27

AW: SQL-Abfrage: Ansatz gesucht
 
Hallo,
ich hätte die jetzt mit Komma getrennt statt einzelne Spalten zu nehmen ...
Aber zusammenbauen kann man das auch ohne die Anzahl zu wissen,
zuerst alle Distinct-Werte holen, zwischenspeichern und dann für jedes Distinct-Projekt auslesen.

Ist aber aufwendig.

Aber: Bekommt man das mit CTE's nicht sogar in einer Query hin???


Heiko

Devil1925 1. Mär 2016 07:38

AW: SQL-Abfrage: Ansatz gesucht
 
Ich hätte jetzt eine Lösung wie du die mehreren Zeilen in einer Zeile mit Kommas getrennt ausgibst...

Code:
SELECT stuff((
    SELECT ', ' + cast(Wert as varchar(max))
    FROM Tabelle
      Where bezug = 4711
    FOR XML PATH('')
   ), 1, 2, '');

Benedikt Magnus 1. Mär 2016 07:38

AW: SQL-Abfrage: Ansatz gesucht
 
Ich hatte so ein ähnliches Problem in meinem aktuellen Projekt auch. Habe das damit gelöst, dass ich die Objekte als JSONs in die Datenbank geschrieben habe, das hat wunderbar funktioniert.

jobo 1. Mär 2016 08:32

AW: SQL-Abfrage: Ansatz gesucht
 
Also es gibt ja mehr oder weniger 2 Varianten
- zentrale Bereitstellung eines (halb)dynamischen Verfahrens / Query
- lokale, also clientseitge Abfrage

Für den ersten Fall muss man mit den gegebenen Möglichkeiten einige Einschränkungen in Kauf nehmen.
Im 2. Fall kann man aber relativ flexibel agieren, wenn man die Query selbst dynamisch zusammenstellt. Hier wären es die Objekte, die jenachdem zusammenzustellen (Liste) wären. Anhand derer kann man dann in einem Query Template entsprechende Case When Spalten einfügen, die für jedes Objekt eine Spalte ausspucken.

freejay 2. Mär 2016 07:04

AW: SQL-Abfrage: Ansatz gesucht
 
Also in MySQL gibt es die Funktion GROUP_CONCAT: Mit der sollte sich das problemlos machen lassen.

In Firebird gibt's das wohl auch ab Version 2.1. Dort heißt die Funktion LIST.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz