Hausnummern - Min und Max

regiontop

Grünschnabel
Hallo,

ich komme bei einer Problemlösung nicht weiter.
Vielleicht hat jemand eine Idee...

Ich möchte aus einer Adressdatenbank (MS SQL 2000) eine Liste generieren, die alle Adressen im Stadtteil angibt. Die Liste soll so aussehen:

Stadtteil | Straßenname | Hausnummer von | Hausnummer bis

oder so:

STT | Straße | HNR von | HNRZ von | HNR bis | HNRZ bis

Bis zu einem bestimmten Punkt komme ich, indem ich je das Minimum und das Maximum der Hausnummern pro Straße und Stadtteil bilde.
Das Problem besteht allerdings darin, dass neben der Hausnummer auch der Hausnummernzusatz (z.B. b bei 15b)wichtig ist. In der DB sind HNR und HNRZ in getrennten Spalten gespeichert. Meine Idee die Spalten zu verbinden und dann je Minimum und Maximum für jede Straße zu bilden, scheitert an der Sortierung (er sortiert 9, 10, 11 vor 11a, 9a ein).

Hier mein erster SQL-Befehlsentwurf:

Select TOP 2000 STT as Stadtteil,
STR_STRS as Straßenname,
min(HNR) as 'HNR von',
max(HNR) as 'HNR bis'
from TBL_STR
where str_hnr is not null
group by STT, STR_STRS
order by STT, STR_STRS

Wie bekomme ich nun den Hausnummerzusatz mit dazu?

In der Basistabelle (TBL_STR) besteht folgender Aufbau:

STT | STR_STRS | STR_HNR | STR_HNRZ
 
Vielleicht hilft folgender Trick:

Betrachte bei der Sortierung (nur dort!) nicht die direkten Hausnummernangaben sondern eine Berechnung der Art
Wenn kein Hausnummern-Zusatz vorhanden, füge eine Null an die Hausnummer (aus 9 würde 90, wie gesagt nur für die Sortierung)
ansonsten füge für die Zuästze a eine 1, b eine 2 etc. an (dazu verwendet man den Ascii-code des Zusatzzeichens bspw, ASC('A')-64 =1, ASC('a')-96=1)
Damit bekämst du folgende Sortierung:
9 => 90
9a => 91
11 => 110
11b=>112
etc.
Dann paßt du die Darstellung wieder an.

So ähnlich sollte es ,
vop
 
Code:
Select TOP 2000 STT as Stadtteil,
STR_STRS as Straßenname,
min(HNR) as 'HNR von',
max(HNR) as 'HNR bis'
from TBL_STR
where str_hnr is not null
group by STT, STR_STRS
order by STT, STR_STRS

Da der HNRZ nicht mit ins group by einfliessen kann, musst du mit einem Subselect arbeiten, der für jede Strasse, für die Du MAX und MIN ausrechnen lässt, den höchsten HNRZ bekommst.

Versuch als erstes aber einfach mal das:

Code:
Select TOP 2000 STT as Stadtteil,
STR_STRS as Straßenname,
min(HNR) as 'HNR von',
max(HNR) as 'HNR bis'
max(HNRZ) as 'HNRZ bis'
from TBL_STR
where str_hnr is not null
group by STT, STR_STRS
order by STT, STR_STRS

Marcus
 
Vielen Dank erstmal für die Antworten, das geht ja wirklich schnell hier :-)

Die Idee mit
Code:
max(hnrz)
war schon ganz gut, es besteht nur das Problem, dass er mir dann den höchsten Hausnummernzusatz ausgibt (pro Straße im Stadtteil). Das führt leider nicht zum gewünschten Ergebnis. Aber trotzdem Danke für den Tipp...
 
Code:
STT | Straße | HNR von | HNR bis | HNRZ



Code:
Select TOP 2000 STT as Stadtteil,
STR_STRS as Straßenname,
min(HNR) as 'HNR von',
max(HNR) as 'HNR bis'
GROUP_CONCAT(DISTINCT HNRZ ORDER BY HNRZ ASC SEPARATOR ', ') as 'HNRZ'
from TBL_STR
where str_hnr is not null
group by STT, STR_STRS
order by STT, STR_STRS

HNRZ kommt dann als a,b,c,d,e,f raus z.B.

Marcus
 
O.K.

Ich glaube ich habe das Problem falsch formuliert. Es geht nicht darum alle Hausnummernzusätze pro Straße zu ermitteln, sondern um die Erzeugung einer Liste mit folgendem Aussehen:

STT | Straße | HNR von | HNRZ von | HNR bis | HNRZ bis
 
regiontop hat gesagt.:
O.K.

Ich glaube ich habe das Problem falsch formuliert. Es geht nicht darum alle Hausnummernzusätze pro Straße zu ermitteln, sondern um die Erzeugung einer Liste mit folgendem Aussehen:

STT | Straße | HNR von | HNRZ von | HNR bis | HNRZ bis

Code:
Select TOP 2000 STT as Stadtteil,
STR_STRS as Straßenname,
min(HNR) as 'HNR von',
min(HNRZ) as 'HNRZ von',
max(HNR) as 'HNR bis'
max(HNRZ) as 'HNRZ bis'
from TBL_STR
where str_hnr is not null
group by STT, STR_STRS
order by STT, STR_STRS
 
Es ist geschafft!

Ein nun drei A4-Seiten langer SQL-String brachte den Erfolg.
Einfache Lösungen, wie max(hnrz) führten zu den falschen Ergebnissen, weil er dabei nur den maximalen Hausnummernzusatz in der (gesamten!) Straße lieferte.

Durch geschickte Subselects in Verbindung mit einer Masse von Joins konnte ich dann den Erfolg feiern.

Vielen herzlichen Dank für die Hilfe im Forum...
Der Tipp mit der Sortierung war übrigens der beste Tipp.
 
Zurück