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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 264512
Url: https://administrator.de/contentid/264512
Ausgedruckt am: 22.11.2024 um 19:11 Uhr
11 Kommentare
Neuester Kommentar
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
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
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.
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.
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.Oder gibt es noch ne andere Möglichkeit?
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.
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
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
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
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