Laden...

Welche Art von Join bei folgendem Problem:

Erstellt von smilingbandit vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.098 Views
S
smilingbandit Themenstarter:in
151 Beiträge seit 2007
vor 15 Jahren
Welche Art von Join bei folgendem Problem:

verwendetes Datenbanksystem: TSQL 2005 und TSQL 2008

Hallo zusammen!

Ich hab das folgende Problem...

Ich möchte eine Ressourcenauslastung auswerten, und die Daten liegen recht verteilt vor.

Es gibt eine Tabelle, in der ich eine ID auslese für die Verfügbarkeit und eine für die Kapazität der Ressource.
Das ist zunächst mal kein Problem.

Mit Hilfe dieser IDs suche ich in einer anderen Tabelle nach einer sogenannten IDDS. Diese identifiziert später die Ressource. In dieser Tabelle steht dann auch der Zahlenwert für die Verfügbarkeit oder die Kapazität. Also (zum Beispiel):

IDDS IDFIELD Number

5 Kapazität 100
5 Verfügbarkeit 50
10 Kapazität 80
20 Verfügbarkeit 12

Man sieht das Problem: Eine Ressource hat in zwei Datensätzen die Werte hinterlegt, nicht in einem. Es kann auch sein, dass nur Kapazität ODER Verfügbarkeit vorhanden ist.

Was ich am Ende haben möchte ist folgende Tabelle:

IDDS Kapazität Verfügbarkeit
5 100 50
10 80 NULL
20 NULL 12

(vereinfacht).

Wenn der eine oder andere Zahlenwert nicht hinterlegt ist, soll dort eben "0" oder NULL stehen.

Ich habs bisher mal mit einem Full outer Join probiert oder einem einfachen INNER JOIN. Beide liefern mir aber nicht das gewünschte Ergebnis.

Hat jemand eine Idee, wie ich das lösen kann? Ich hab das Gefühl, das ist gar nicht so schwer. Aber irgendwie steh ich aufm Schlauch.

Vielen Dank schonmal

J
1.114 Beiträge seit 2007
vor 15 Jahren

Bei schlechtem Datenbankdesign wird es nachher immer schwer, bei den Abfragen wieder alles umzukramen.

Beste Lösung: Ändere das Design, wenn du es noch kannst
oder Bastellösung z.B. über eine SP die dir umständlich dein Ergebnis zusammenfriemelt.

T-SQL kann ab der 2008 auch mit Pivottabellen umgehen. Das hilft dir auch vielleicht weiter, hab das aber noch nich benutzt da ich selbst vorwiegend noch auf SQL2000 arbeite.

H
208 Beiträge seit 2008
vor 15 Jahren

Über das Tabellendesign hat Jelly ja schon was geschrieben.

Die Abfrage müßte eigentlich so klappen (ungetestet, weil gerade kein SQL Server zur Hand):


select i.ID, r1.Number as Kapazitaet, r2.Number as Verfuegbarkeit
from IdTabelle i
left join RessourcenTabelle r1 on i.ID = r1.IDDS and r1.IDFIELD = 'Kapazität'
left join RessourcenTabelle r2 on i.ID = r2.IDDS and r2.IDFIELD = 'Verfügbarkeit'

Der Trick ist, die Tabelle mit den Kapazitäts- und Verfügbarkeitsdaten (in meiner Abfrage "Ressourcentabelle") 2x unter verschiedenen Aliasen zu joinen - einmal nur mit den Kapazitäten und einmal nur mit den Verfügbarkeiten.

T
574 Beiträge seit 2008
vor 15 Jahren

Solange es nur diese 2 Eigenschaften sind müsste es über haarrrgh's Variante problemlos funktionieren. Sollten das aber beliebig viele Einträge sein, wird man über die Pivot() funktion nicht mehr herumkommen. Die ist zwar anfangs recht unverständlich aber dann sehr dienlich.

S
smilingbandit Themenstarter:in
151 Beiträge seit 2007
vor 15 Jahren

Hallo zusammen,

mit den ganze Left Outer Joins hats dann funktioniert. Der Query ist ziemlich unübersichtlich geworden, sammelt aber -glaube ich- die Daten, die ich brauche.

Nun hat sich aber ein anderes Problem ergeben. Ich brauche eine Auswertung über den Fortschritt, bzw. die Arbeitsstunden in einem Task (später mal nach Resource und Assignments aufgeteilt).

Mein Problem: Es ist lediglich hinterlegt, wie weit ein Task insgesamt zum reporteten Zeitraum ist.
Nun bin ich auf die Idee gekommen, dass man ja die Differenz errechnen könnte zu den zeitmässig vorherigen Datensätze, die sich sich ebenfalls auf diesen Task beziehen. Per Code würde ichs rekursiv lösen, dass er zum Vormonat immer noch die Differenz berechnet. Aber wie mache ich das mit SQL? Jemand eine Idee?

Vielen Dank schonmal

edit: Auf den Hinweis mit der Pivot hin hab ich mir das angesehen und werds mal so versuchen. Wusste bisher gar nicht, dass SQL das kann -.-"

edit2: Spalte für Spalte eine Differenz zu bilden ist wohl doch schwieriger als ich dachte. Falls jemand nen Tip dazu hat immer her damit ^^