SQL Reporting Fremdschlüssel

steppi

Commander
Registriert
Apr. 2012
Beiträge
2.161
Hallo Zusammen,

ich hoffe, dass ich das hier platzieren darf und mir eventuell Jemand auf die Sprünge helfen kann.
Seit Jahren ist es mal wieder Zeit, dass ich mich mit Datenbanken und den ReportingServices beschäftige.

Nun habe ich schon 2-3 DataSets und Reports gebaut, die auch alle wunderbar funktionieren. Diese waren recht "simpel" gestrickt und alles war eindeutig. Soweit so gut. Um mein Problem näher zu erklären nutze ich vlt. direkt mal ein Beispiel:

  • Ich habe zwei Tabellen "Fahrten" und "Stammdaten_Orte".
  • in "Fahrten" befinden sich die Felder Fahrt_ID, Startort_id, Zielort_id, Transportmittel_id, Reisedatum, ...
  • in "Stammdaten_Orte" befinden sich die Felder Standort_id (Primarykey), Bezeichnung_lang, Bezeichnung_kurz

Ich möchte nun eine Abfrage machen, wo es mir die Fahrten ausgibt.
Natürlich möchte ich im Report nicht sehen von "112" nach "286", sondern von "Entenhausen" nach "Buxtehude".
Hätte ich jetzt nur einen Ort (z.B. Startort), würde ich ja z.B. Standort_id über einen InnerJoin mit z.B. Startort_ID ausführen.

Wie kann ich meine Stammdaten (Orte) nun innerhalb einer Abfrage und Fremdtabelle mit den unterschiedlichen Feldern verknüpfen?

P.S.:
Ich habe keine Einfluss auf die gelieferte Datenbank und darf nur Abfragen.
 
Nimm einfach 2 inner joins, einmal zur ersten ID joinen und ein zweites mal zur zweiten ID.
Du musst beim join nur einen Namen für die Tabelle vergeben, z.B. join Stammdaten_Orte as Orte1 .... join Stammdaten_Orte as Orte2 und dann kannst du auf die Felder mit Orte1.Bezeichnung_lang zugreifen.
 
  • Gefällt mir
Reaktionen: steppi
Inner Join auf Standort_id und in der Abrage dann Stamdaten_orte1.Bezeichnung_lang abfragen wenn ich die Ausführung richtig verstanden habe.
und Das gleiche nochmal Stamdaten_orte2.Bezeichnung
 
  • Gefällt mir
Reaktionen: steppi
Also ich verstehe was Ihr meint, der ReportBuilder gibt mir leider trotzdem Fehler aus, aber der ist eh etwas spezieller.

Ich versuch es mal auf den Abschnitt zu begrenzen und das Beispiel zu verwenden:

select
db1.fahrten.startort_id
db1.fahrten.zielort_id
from
db1.stammdaten_orte
Inner Join db1.fahrten as Orte1
on db1.stammdaten_orte.standort_id = db1.fahrten.startort_id

...

So wäre jetzt mal der Abriss wenn ich euch richtig verstanden habe und darunter dann der zweite Join für die Zielorte. Natürlich müsste ich dann ins Select noch Orte1 und Orte2 mit der Langbezeichnung aufnehmen?
 
Zuletzt bearbeitet:
In etwa so:
SQL:
select f.fahrt_id, s.bezeichnung_lang, z.bezeichnung_lang
from fahrten f inner join stammdaten_orte s on f.startort_id = s.standort_id
inner join stammdaten_orte z on f.zielort_id = z.standort_id
 
  • Gefällt mir
Reaktionen: nik_ und steppi
Thaddelino schrieb:
In etwa so:
SQL:
select f.fahrt_id, s.bezeichnung_lang, z.bezeichnung_lang
from fahrten f inner join stammdaten_orte s on f.startort_id = s.standort_id
inner join stammdaten_orte z on f.zielort_id = z.standort_id

Danke, da klingelts wieder.
Irgendwie lässt es sich als solches im ReportBuilder aber nicht umsetzen. Ich glaub ich muss das mal mit einem anderen Tool testen. Oder ich habe noch einen anderen Fehler drin.
Ergänzung ()

Ergänzung:

Gebe ich es wie folgt an

"FROM Datenbank.Tabelle f inner join ..." erhalte ich "ungültiger Spaltenname..."
"FROM Tabelle f inner join ..." erhalte ich "ungültiger Objektname..."
"FROM Datenbank.Tabelle inner join ..." erhalte ich "der mehrteilige Bezeichner ... konnte nicht gebunden werden"

Aufbau der Abfrage/ Syntax nach @Thaddelino

EDIT:
Fehler gefunden! Ich Depp
Ergänzung ()

Danke allesamt. Es funktioniert.
 
Zuletzt bearbeitet:
Blöde Frage noch zum ReportBuilder bzw. zum ReportServer.
Kann ich es dem Nutzer ermöglichen den ausgegeben Report direkt an den jeweiligen Spalten zu nochmal zu Filtern? Also ähnlich wie im Excel z.B. bei einer Pivot oder mit den Autofiltern?

Das interaktive Sortieren habe ich hinbekommen und auch so, dass es richtig angewendet wird.
 
Also je nach Software kannst du evtl. einen weiteren Filter setzen wie:

from fahrten f inner join stammdaten_orte s on f.startort_id = s.standort_id
inner join stammdaten_orte z on f.zielort_id = z.standort_id
where Stammdaten_Orte.Bezeichnung_lang like ?Bezeichnung_lang

Zumindest bei meinem Abfragetool kommt da ein Popup, welches einen zusätzlichen Filter als Usereingabe erlaubt. Da geht den auch Ente% oder %hausen
 
Danke erstmal, das ist soweit bekannt.
Mir ging es eher um Filter im Excelstil je Spalte, aber ich denke das wird bei diesen einfachen, paganierten Reports nicht funktionieren. Höchstens über Parameter im Kopf des Report, wo ich die Datenbereiche explizit vorfiltere.
 
Du kannst Parameter in deine RDL bauen und die in deinem Dataset benutzen. Bei multi select nicht vergessen auf IN in der where clause zu gehen.
 
  • Gefällt mir
Reaktionen: steppi
Danke nochmal fürs Feedback.

Die Parameter sitzen ja aber dann auch im Kopf des Report? Da hatte ich z.B. schon die Datumsfilter als Bereichsfilter "Von" "Bis" drin. Ist aber nicht schlimm, da es an sich keine Anforderung darstellt. Ich wollte da dem Bereich, der es verwendet etwas komfortabler machen. Da die Berichte teilweise aber eh nach Excel exportiert werden, spielt es keine Rolle, spätestens dort können die Leute ja die Autofilter drüber legen.

Danke euch Allen.
 
Ja, sitzen sie. Den Filter auf Spaltenebene gibt es so direkt in SSRS nicht, halt nur per Parameter.
 
  • Gefällt mir
Reaktionen: steppi
Okay, danke. Ja das war dann in soweit bekannt bzw. schon in Benutzung.
Ist wie gesagt, aber auch halb so wild. Aktuell gleicht es mehr noch einem Experimentieren (zumindest im Schulungssystem), auch wenn die ersten Statistiken nun schon produktiv sind.
 
Zurück
Oben