Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Höchsten Wert aus nvarchar Spalte finden

Frage Entwicklung Datenbanken

Mitglied: orausdo

orausdo (Level 1) - Jetzt verbinden

25.02.2015 um 14:06 Uhr, 624 Aufrufe, 11 Kommentare

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.




Mitglied: SlainteMhath
LÖSUNG 25.02.2015, aktualisiert 09.03.2015
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
Bitte warten ..
Mitglied: Logan000
LÖSUNG 25.02.2015, aktualisiert 09.03.2015
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.
Bitte warten ..
Mitglied: Biber
LÖSUNG 25.02.2015, aktualisiert 09.03.2015
[OT]
...so, so... Datenbanken könnt ihr Dortmunder also auch nicht...
Na dann viel Spass beim Revierderby am Wochenende.

Grüße
Biber
[/OT]
Bitte warten ..
Mitglied: orausdo
25.02.2015 um 14:39 Uhr
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
Bitte warten ..
Mitglied: SlainteMhath
LÖSUNG 25.02.2015, aktualisiert 09.03.2015
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.
Bitte warten ..
Mitglied: Biber
LÖSUNG 25.02.2015, aktualisiert 09.03.2015
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.

01.
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
Bitte warten ..
Mitglied: orausdo
25.02.2015 um 14:57 Uhr
Hat da ein Meister der Herzen gesprochen... ?

Schauen wir mal was am WE passiert... Wir sind mal wieder dran...
Bitte warten ..
Mitglied: orausdo
25.02.2015 um 15:01 Uhr
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
Bitte warten ..
Mitglied: Biber
LÖSUNG 25.02.2015, aktualisiert 09.03.2015
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
Bitte warten ..
Mitglied: orausdo
25.02.2015 um 15:24 Uhr
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
Bitte warten ..
Mitglied: orausdo
09.03.2015 um 12:49 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(1)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...