Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   [SQL] Zeilenwerte als Spalten ausgeben (https://www.delphipraxis.net/131396-%5Bsql%5D-zeilenwerte-als-spalten-ausgeben.html)

Reinhardtinho 24. Mär 2009 11:54

Datenbank: MSSQL Server 2000 • Zugriff über: SQL-Script

[SQL] Zeilenwerte als Spalten ausgeben
 
Hi zusammen,

ich möchte gerne Zeilen einer SQL-Tabelle als Spalten ausgeben lassen.
Ich habe eine Tabelle "Article" in der Merkmale zu einem Artikel stehen. In der Tabelle "ArticleProperty" stehen zu jedem Eintrag in Artikel weitere dynamische Merkmale.

So sind meine Tabellen aufgebaut:

Article
Code:
ArticleNumber (PK)
EAN
Supplier
...
ArticleProperty
Code:
ArticleNumber (PK)
TypeID (PK)
Value
In "ArticleProperty" könnte zb drin stehen.

Code:
ArticleNumber     TypeID     Value
4711               Size       M
4711               Color      Blue
Jetzt weiß ich nicht, wie ich die SQL-Abfrage aufbauen soll, damit ich den Artikel in einer flachen Struktur mit all seinen Merkmalen ausgeben kann.

Code:
ArticleNumber     EAN      Supplier     Size     Color
Bin für jeden Tipp dankbar.
MFG

Bernhard Geyer 24. Mär 2009 12:14

Re: [SQL] Zeilenwerte als Spalten ausgeben
 
Such mal unter dem Schlagwort "PIVOT". Evtl. bekommst du es damit hin.
Ansonsten würde ich es erst im Client passend umformen und die DB außen vor lassen.

nahpets 24. Mär 2009 12:25

Re: [SQL] Zeilenwerte als Spalten ausgeben
 
Hallo,

versuche es doch mal damit:
SQL-Code:
select
  Article.ArticleNumber,
  Article.EAN,
  Article.Supplier,
  ArticlePropertySize.Value As Size,
  ArticlePropertyColor.Value As Color
from Article,
      ArticleProperty ArticlePropertySize,
      ArticleProperty ArticlePropertyColor
where Article.ArticleNumber = ArticlePropertySize.ArticleNumber and ArticlePropertySize.TypeID = 'Size'
and  Article.ArticleNumber = ArticlePropertyColor.ArticleNumber and ArticlePropertyColor.TypeID = 'Color'
Die Tabelle ArticleProperty wird zweimal in das From genommen, um einmal den Satz mit TypeID = Size und einmal den Satz mit TypeID = Color zu lesen.

Reinhardtinho 24. Mär 2009 13:16

Re: [SQL] Zeilenwerte als Spalten ausgeben
 
Danke für die Antworten.

@Nahpets
Da die Merkmale dynamisch sind, kann ich das nicht fest mit Size bzw. Color verdrahten. Zu Zeitpunkt der Abfrage kenne ich nicht alle Properties.

@Bernhard Geyer
Ich habe mir vorher auch schon diverse Beispiele mit "PIVOT" angeschaut, allerdings war dort das selbe Schema, dass man die Properties schon alle kennen musste.
Mir bleibt anscheinend nichts anderes übrig, als das nachträglich im Client umzuformen. Ich hatte gehofft, dafür gibt es eine Möglichkeit, dass mit einem SQL-Script aufzubereiten.

DeddyH 24. Mär 2009 13:41

Re: [SQL] Zeilenwerte als Spalten ausgeben
 
Hier ist ein Ansatz zu dynamischen Pivor-Tabellen in einer SP, evtl. hilft Dir das als Ansatz ja weiter.

nahpets 24. Mär 2009 14:06

Re: [SQL] Zeilenwerte als Spalten ausgeben
 
Hallo,
Zitat:

Zitat von Reinhardtinho
Da die Merkmale dynamisch sind, kann ich das nicht fest mit Size bzw. Color verdrahten. Zu Zeitpunkt der Abfrage kenne ich nicht alle Properties.

dann erstelle doch das SQL auch dynamisch:
SQL-Code:
select
  'select '
union all
select Distinct
  'ArticleProperty' + RTrim(TypeID) + '.Value As ' + RTrim(TypeID) + ', '
from articleproperty
union all
select
  'Article.ArticleNumber, '
+ 'Article.EAN, '
+ 'Article.Supplier '
+ 'from Article '
union all
select Distinct
  'left join ArticleProperty ArticleProperty' + RTrim(TypeID) + ' on article.articleNumber = '
+ 'ArticleProperty' + RTrim(TypeID) + '.articleNumber '
+ 'and ArticleProperty' + RTrim(TypeID) + '.TypeID = ''' + RTrim(TypeID) + ''''
from articleproperty
Vorgehen:

Dieses SQL ausführen, das Ergebnis auslesen und einer Query als SQL zuweisen und dann ausführen.

Es wird zuerst ein SQL erstellt, das für jeden Eintrag von TypeID eine Spalte in das SQL-Ergebnis schreibt und für jeden Eintrag von TypeID einen Left Join für das From erstellt.

Das hierdurch erstellte SQL entspricht dann immer dem aktuellen Datenbestand der Tabelle ArticleProperty. Das Gesamtergebnis enthält immer die Spalten ArticleNumber, EAN und Supplier, sowie für jeden Eintrag von TypeID in ArticleProperty eine weitere Spalte. Die dynamischen Spalten werden zuerst ausgegeben, um eine korrekte SQL-Syntax zu generieren, ohne auf eventuell überzählige Kommata achten zu müssen.

Diese SQL wurde mit dem oben aufgeführten SQL erstellt.
SQL-Code:
select
ArticlePropertyColor.Value As Color,
ArticlePropertyMaterial.Value As Material,
ArticlePropertySize.Value As Size,
Article.ArticleNumber, Article.EAN, Article.Supplier from Article
left join ArticleProperty ArticlePropertyColor on article.articleNumber = ArticlePropertyColor.articleNumber and ArticlePropertyColor.TypeID = 'Color'
left join ArticleProperty ArticlePropertyMaterial on article.articleNumber = ArticlePropertyMaterial.articleNumber and ArticlePropertyMaterial.TypeID = 'Material'
left join ArticleProperty ArticlePropertySize on article.articleNumber = ArticlePropertySize.articleNumber and ArticlePropertySize.TypeID = 'Size'

Reinhardtinho 24. Mär 2009 14:24

Re: [SQL] Zeilenwerte als Spalten ausgeben
 
Das funktioniert perfekt.

Vielen Dank. Damit hast du mir sehr geholfen.

Natürlich auch Dank an alle anderen :wink:

:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 Uhr.

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