AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken [SQL] Zeilenwerte als Spalten ausgeben
Thema durchsuchen
Ansicht
Themen-Optionen

[SQL] Zeilenwerte als Spalten ausgeben

Ein Thema von Reinhardtinho · begonnen am 24. Mär 2009 · letzter Beitrag vom 24. Mär 2009
Antwort Antwort
Benutzerbild von Reinhardtinho
Reinhardtinho

Registriert seit: 26. Feb 2007
411 Beiträge
 
Delphi 5 Enterprise
 
#1

[SQL] Zeilenwerte als Spalten ausgeben

  Alt 24. Mär 2009, 10:54
Datenbank: MSSQL Server 2000 • Zugriff über: SQL-Script
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
Ich habe viel von meinem Geld für Alkohol, Weiber und schnelle Autos ausgegeben ... Den Rest habe ich einfach verpraßt.

George Best - 22.05.1946 - 25.11.2005 - nordirischer Fußballspieler
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: [SQL] Zeilenwerte als Spalten ausgeben

  Alt 24. Mär 2009, 11:14
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

Re: [SQL] Zeilenwerte als Spalten ausgeben

  Alt 24. Mär 2009, 11:25
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.
  Mit Zitat antworten Zitat
Benutzerbild von Reinhardtinho
Reinhardtinho

Registriert seit: 26. Feb 2007
411 Beiträge
 
Delphi 5 Enterprise
 
#4

Re: [SQL] Zeilenwerte als Spalten ausgeben

  Alt 24. Mär 2009, 12:16
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.
Ich habe viel von meinem Geld für Alkohol, Weiber und schnelle Autos ausgegeben ... Den Rest habe ich einfach verpraßt.

George Best - 22.05.1946 - 25.11.2005 - nordirischer Fußballspieler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: [SQL] Zeilenwerte als Spalten ausgeben

  Alt 24. Mär 2009, 12:41
Hier ist ein Ansatz zu dynamischen Pivor-Tabellen in einer SP, evtl. hilft Dir das als Ansatz ja weiter.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

Re: [SQL] Zeilenwerte als Spalten ausgeben

  Alt 24. Mär 2009, 13:06
Hallo,
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'
  Mit Zitat antworten Zitat
Benutzerbild von Reinhardtinho
Reinhardtinho

Registriert seit: 26. Feb 2007
411 Beiträge
 
Delphi 5 Enterprise
 
#7

Re: [SQL] Zeilenwerte als Spalten ausgeben

  Alt 24. Mär 2009, 13:24
Das funktioniert perfekt.

Vielen Dank. Damit hast du mir sehr geholfen.

Natürlich auch Dank an alle anderen

Ich habe viel von meinem Geld für Alkohol, Weiber und schnelle Autos ausgegeben ... Den Rest habe ich einfach verpraßt.

George Best - 22.05.1946 - 25.11.2005 - nordirischer Fußballspieler
  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 07:48 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