Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Stati per Select aneinandergereiht (https://www.delphipraxis.net/57271-stati-per-select-aneinandergereiht.html)

smudo 18. Nov 2005 07:45

Datenbank: Interbase • Version: 6.1 • Zugriff über: egal

Stati per Select aneinandergereiht
 
Hallo,

ich habe gestern hier schon zu diesem Thema sehr gute Anregungen erhalten.
Ich erläutere nochmal kurz den Inhalt:

Ich habe eine Detailtabelle in welcher zu einer Person verschiedene Stati gespeichert sind:
Person1 S1
Person1 S2
Person1 S3
Person2 S1
Person2 S3
Person3 S1
Person3 S2

Jetzt möchte ich per Select alle Stati zu einer Person aneinanderreihen, sodass ich pro Person nur noch einen Datensatz mit einem Feld, welches alle zur Person zugeordneten Stati enthält, erhalte. (erhalten tun tue :zwinker: )
Mit einem kleinen Delphi-Prog klappt das schon. Mich würde nur interessieren, ob es auch direkt über SQL funktioniert?

marabu 18. Nov 2005 07:54

Re: Stati per Select aneinandergereiht
 
Hallo René,

aneinanderreihen? Wenn du eine String-Verkettung meinst, dann wirst du es über eine Stored Procedure machen müssen, da Interbase die speziellen Group-Aggregate von MySQL (GROUP-CONCAT) nicht kennt. Ohne Verkettung wäre eine Matrix-Transposition notwendig, die von IB SQL auch nicht unterstützt wird.

Grüße vom marabu


Nachtrag:
Wenn du deine Stati auf binäre Zustände zurückführen kannst, dann hilft dir vielleicht folgende Denormalisierung - ungetestet, aber die Idee sollte rüber kommen:

SQL-Code:
SELECT person, SUM(status) AS status FROM (
  SELECT person, 1 AS status FROM details WHERE status = 'S1'
  UNION
  SELECT person, 2 AS status FROM details WHERE status = 'S2'
  UNION
  SELECT person, 4 AS status FROM details WHERE status = 'S3'
)

smudo 18. Nov 2005 08:14

Re: Stati per Select aneinandergereiht
 
Hallo marabu,

das mit der Stored Proc sollte funktionieren, werd ich gleich mal umsetzen.
Dein zweiter Vorschlag ist sehr interessant, dürfte aber etwas umständlich werden, da ich sehr viele Stati vorzuliegen habe.

Vielen Dank

René

smudo 18. Nov 2005 08:39

Re: Stati per Select aneinandergereiht
 
...etwas zu zeitig jubiliert :gruebel:

In einer SP kann ich per Select Into natürlich immer nur einen Wert abfragen und abspeichern.
Ein Weg wäre also für jeden Status zu dieser Person eine Abfrage auszuführen, das ist aber inakzeptabel, da die Menge der möglichen Stati sehr groß ist.
In MS-SQL-Server hätte ich jetzt einfach einen Cursor auf die abgefragte Menge der Stati gesetzt. Geht sowas in Interbase auch?

René

marabu 18. Nov 2005 08:45

Re: Stati per Select aneinandergereiht
 
Natürlich kennt die IB SPL auch cursor - schau mal in der SQLREF.HLP unter DECLARE CURSOR.

marabu

smudo 18. Nov 2005 09:03

Re: Stati per Select aneinandergereiht
 
So, ich habs jetzt:

SQL-Code:
CREATE PROCEDURE GETSTATILISTE (
    PNR CHAR(15) CHARACTER SET ISO8859_1)
RETURNS (
    STATILISTE VARCHAR(999) CHARACTER SET ISO8859_1)
AS
DECLARE VARIABLE STATUS VARCHAR(10) CHARACTER SET ISO8859_1;
begin
  statiliste='';
  for select details.status
  from details d
  where d.PNr=:PNr
  into :status
  as cursor StatCursor do
  begin
    if (statiliste='') then
      statiliste=:statiliste || :status;
    else
      statiliste=:statiliste || ', ' || :status;
  end
  suspend;
end^


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:39 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