AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SQL-Abfrage: Ansatz gesucht
Thema durchsuchen
Ansicht
Themen-Optionen

SQL-Abfrage: Ansatz gesucht

Ein Thema von Berni68 · begonnen am 28. Feb 2016 · letzter Beitrag vom 2. Mär 2016
Antwort Antwort
Berni68

Registriert seit: 9. Jan 2006
Ort: Villingen
162 Beiträge
 
Delphi XE5 Professional
 
#1

SQL-Abfrage: Ansatz gesucht

  Alt 28. Feb 2016, 14:36
Datenbank: Firebird • Version: 2,5 • Zugriff über: IBDAC
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?
Bernhard
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: SQL-Abfrage: Ansatz gesucht

  Alt 28. Feb 2016, 15:42
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.
Gruß, Jo
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: SQL-Abfrage: Ansatz gesucht

  Alt 1. Mär 2016, 05:49
Hallo,
geht schon, mit einer Stored Procedure.


Heiko
Heiko
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: SQL-Abfrage: Ansatz gesucht

  Alt 1. Mär 2016, 07:04
Aber auch nur wenn die Anzahl der Spalten bekannt ist
Markus Kinzler
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: SQL-Abfrage: Ansatz gesucht

  Alt 1. Mär 2016, 07:27
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
Heiko

Geändert von hoika ( 1. Mär 2016 um 07:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Devil1925
Devil1925

Registriert seit: 20. Nov 2015
Ort: Saerbeck
236 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: SQL-Abfrage: Ansatz gesucht

  Alt 1. Mär 2016, 08:38
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, '');
Philipp
Höllische Grüße
Devil
Meistens sitzt das Problem vor dem Bildschirm! - Leider bin das oftmals ich.
  Mit Zitat antworten Zitat
Benedikt Magnus

Registriert seit: 6. Jul 2012
Ort: Bonn
190 Beiträge
 
FreePascal / Lazarus
 
#7

AW: SQL-Abfrage: Ansatz gesucht

  Alt 1. Mär 2016, 08:38
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.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: SQL-Abfrage: Ansatz gesucht

  Alt 1. Mär 2016, 09:32
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.
Gruß, Jo
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
272 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: SQL-Abfrage: Ansatz gesucht

  Alt 2. Mär 2016, 08:04
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.
[Delphi 11.3.1 Enterprise; Win10/11; MySQL; VCL]

Geändert von freejay ( 2. Mär 2016 um 08:07 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:03 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