orausdo
Goto Top

Höchsten Wert aus nvarchar Spalte finden

Hallo liebe Admins,

ich habe folgende Problem.
Ich habe eine Tabelle, in der Werte für die Kalenderwoche weggeschrieben werden.
Die Spalte ist allerdings als nvarchar(6) definiert.

Ich habe es mit folgenden Statements versucht:

1. select max(cast(kw as int)) as INT_WERT from Test_Tabelle
oder
2. select max(cast(kw as nvarchar(6))) as NVARCHAR_WERT from Test_Tabelle

Die Werte werden im Format 20151,20152,20153,.....,.20159,201510,usw. geschrieben.
In der Test_Tabelle sind 3 Werte vorhanden... ,20159,201510,201511

Abfrage 1 liefert 201511, Abfrage 2 liefert 20159

Das Anbfr. 1 den Wert 201511 liefert ist klar, da der Wert grösser ist als 20159...

Das Problem tritt jeweils auf, wenn am Ende eines Jahres oder Anfang eines Jahres folgende Konstellation entsteht...

Ende 2014 gibt es die KW 201452, eine Auswertung Anf. 2015 mit höchstem KW Wert 20151 für 1. KW in 2015 liefert mir Abfr. 1 die letzte KW aus 2014, nämlich 201452,
lasse ich die Abfr. 2 laufen kommt der korrekte Wert 20151 !
Anders ist es beim Wechsel von 20159 auf 201510, lasse ich dort Abfr. 2 laufen kommt der falsche Wert 20159 heraus, also muss ich die Abfr. wieder auf Version 1 umstellen, damit ich den korrekten Wert 201510 bekomme?

Kann mir einer bitte einen Tipp geben, wie man immer den höchsten KW Wert findet, ohne jedes mal die Abfrage umzustellen?

Herzlichen Dank für Infos und Hilfe.

Beste Grüsse aus Dortmund.

Content-ID: 264512

Url: https://administrator.de/contentid/264512

Ausgedruckt am: 22.11.2024 um 19:11 Uhr

SlainteMhath
Lösung SlainteMhath 25.02.2015, aktualisiert am 09.03.2015 um 12:50:13 Uhr
Goto Top
Moin,

das Problem wirst du mit einem max() imo nicht gelöst bekommen, da die Daten schon "falsch" in der Tabelle stehen. Was dir fehlt ist die führende 0 vor der KW falls diese <10 ist.

KW 01/2015 müsste als "201501" im Feld stehen, nicht als "20151".

Was du brauchst ist eine Funktion die dir die ersten 4 Stellen der KW (das Jahr) mit "dem Rest" der Stellen aus dem Feld zusammenklebt und dazwischen eine 0 einfügt, falls "der Rest" <10 ist. Das ganze kannst du dann in einen int casten und mit max() auswerten.

lg,
Slainte
Logan000
Lösung Logan000 25.02.2015, aktualisiert am 09.03.2015 um 12:50:19 Uhr
Goto Top
Moin Moin,

Schreib dir ein Update Statement mit dem du die 1-stelligen KW mit führenden Nullen versiehst.
Also: KW 9 in 2015 wird zu 201509 statt 20159.
Dann wird das auch mit dem sortieren bzw. dem Max einfacher.

Anders währe höchst wahrscheinlich möglich aber definitiv nicht besonders performant.

Gruß L.
Biber
Lösung Biber 25.02.2015, aktualisiert am 09.03.2015 um 12:50:22 Uhr
Goto Top
[OT]
...so, so... Datenbanken könnt ihr Dortmunder also auch nicht...
Na dann viel Spass beim Revierderby am Wochenende.

Grüße
Biber
[/OT]
orausdo
orausdo 25.02.2015 um 14:39:25 Uhr
Goto Top
Moinsen Slainte,

vielen Dank für Deine Info.

Habe es nun so versucht und es scheint zu klappen...

select max(cast(iif(len(kw) < 6 ,left(kw,4) + '0' + right(kw,1),kw) as int)) as MAX_KW from Test_Tabelle

Das sollte doch eigentlich für alle noch kommenden Konstellationen reichen, oder was meinst Du?

Oder gibt es noch ne andere Möglichkeit?

Dank für weitere Hilfe.

Gruss aus DO
SlainteMhath
Lösung SlainteMhath 25.02.2015, aktualisiert am 09.03.2015 um 12:50:26 Uhr
Goto Top
select max(cast(iif(len(kw) < 6 ,left(kw,4) + '0' + right(kw,1),kw) as int)) as MAX_KW from Test_Tabelle
Oder gibt es noch ne andere Möglichkeit?
Ja für das Query funktioniert das. Allerdings ist das, wie Logan schon schrieb, alles andere als performant. Mach am besten einmal ein Update Query über die gesammte Tabelle (notfalls in der un-produktiven Zeit) und dann kannst du locker mit max() arbeiten.
Biber
Lösung Biber 25.02.2015, aktualisiert am 09.03.2015 um 12:50:27 Uhr
Goto Top
Moin orausdo,

wie schon geschrieben wurde: eine korrekte Sortierung einer selbst erfundenden Jahr/KW-Varchar-Spalte wird nur funktionieren, wenn alle Varcharfelder einheitlich 6 Stellen lang sind, Also muss eine KW 1 als 01, eine KW 2 als 02 etc die letzten zwei Stellen des 6stelligen Feldes bilden.
Wenn du -aus welchen unerfindlichen Gründen auch immer - KEIN Update auf die bisherigen Werte machen kannst/willst/darfst, dann musst du rechnen, zb.

select max(cast(left(kw,4)  as int) * 100 + cast(rtrim(mid(kw,5,2)) ss int) as MAX_KW from Test_Tabelle 

Aber warum bringst du die KW-Daten nicht auf einheitlich Varchar(6)-Länge oder auf int-Werte zwischen 201401 und 201552?

Grüße
Biber
orausdo
orausdo 25.02.2015 um 14:57:16 Uhr
Goto Top
Hat da ein Meister der Herzen gesprochen... ? face-smile

Schauen wir mal was am WE passiert... Wir sind mal wieder dran...
orausdo
orausdo 25.02.2015 um 15:01:46 Uhr
Goto Top
Danke Dir Biber.

Deine Abfr. geht genauso wie meine. Kann denn eine noch auf einen Fehler laufen in der Zukunft?

Welche ist besser/performanter?

Leider muss ich dafür erst alle Prozeduren anpassen die diese Werte in die entsp. Tab wegschreiben...

Mit diesem Statement wäre ich aus dem Schneider und bräuchte nichts mehr weiter machen...

Danke euch allen.

Gruss
Biber
Lösung Biber 25.02.2015, aktualisiert am 09.03.2015 um 12:50:32 Uhr
Goto Top
Moin orausdo,

die Frage nach der performantesten Lösung ist hier nicht zielführend.

Denn die ganze CASTerei/Konvertiererei ist ja so oder so überflüssig, wenn du - wie oben skizziert- entweder für eine einheitliche/normierte Speicherung dieser JahresKW als 6stelligen String sorgst oder gleich als Integerwert speicherst. Stell also die Eingaberoutinen um.

Als Krücke werden sowohl deine wie meine Abfrage laufen - deine wird robust laufen, wenn es nur 5stellige und 6stellige Ziffernfolgen in dem Feld gibt und meine wird stabil laufen, solange nur Ziffern enthalten sind.

Wenn irgendwie ein Wert "2015a5" in das Varchar-Feld gerutscht ist, dann grätschen wir gleichermaßen ab.

Grüße von dem Stadion, um das sogar die Weser einen Bogen macht
Biber
orausdo
orausdo 25.02.2015 um 15:24:33 Uhr
Goto Top
Moin Biber,

alles klar. Danke Dir.

Es werden keine 2015a5 Werte weggeschrieben... also nur Zahlen...
Unsere Statements sollten also funzen...

Aber vielleicht mache ich mal daran die Proz. welche diese Werte erzeugen umzuschreiben, damit immer ein 6-stelliger Wert geschrieben wird.

Danke nochmals an Alle und bis in Kürze mal.

Grüsse an die Weser von der Ruhr..., Der O
orausdo
orausdo 09.03.2015 um 12:49:01 Uhr
Goto Top
Hallo zusammen,

ich habe, nach meinem Urlaub, nun doch wie ihr gesagt habt, die komplette Tabelle geupdatet und schreibe die KW nun 6-stellig weg.
Danach Wert als int gecastet abgefragt und alles wird gut.
Nun sollte das Problem hoffentlich nicht mehr auftauchen.

Danke an alle für die Hilfe.

Gruss aus DO, orausso