Benutzer mit den meisten Antworten
Filtern, anhand eines Datums bei begrenzten Informationen

Frage
-
Hallo liebe Forumsmitglieder,
ich habe folgende Daten in einer Tabelle:
WITH [Kalender] ([Jahr],[B_MJAN],[B_MFEB],[B_MMAR]) AS ( SELECT '2019', 'FBBBWWAAAAAWWAAAAAWWAAAAAWWAAAA', 'AWWAAAAAWWAAAAAWWAAAAAWWAAAAXXX', 'AWWAAAAAWWAAAAAWWAAAAAWWAAAAAWW' ) SELECT * FROM [Kalender]
Jeder Monat hat 31 Zeichen. Die sind wie folgt zu Unterscheiden. F=Frei,B=Frei,W=Frei,A=nicht Frei, X=den Tag gibt es im Monat nicht. Von links nach rechts ist es 1,2,3,4,5 ...,30,31 des Monats. Die SUM(A) in einem Monat habe ich hinbekommen, jedoch schaffe ich es nicht nach einem Tag zu filtern z. B. 02 Januar 2019 bis 08 Januar 2019, dass wären dann nur 2 A's. Ist es möglich das wie von mir gewünscht zu realisieren? Ich habe schon probiert mit DATEDIFF() etc zu arbeiten, aber das macht kein Sinn, da ich die Werte nicht einem Datum zuordnen kann. Kenn jemand evtl. Tricks um das zu realisieren oder kann mir paar Tipps geben? Über Hilfe wäre ich sehr dankbar. Muss ich evtl vorher alle Strings zusammen nehmen und damit hantieren?
Mit freundlichen Grüßen
dash_
Antworten
-
Hi,
Kenn jemand evtl. Tricks um das zu realisieren oder kann mir paar Tipps geben? Über Hilfe wäre ich sehr dankbar. Muss ich evtl vorher alle Strings zusammen nehmen und damit hantieren?
"Trick" würde ich das zwar nicht nennen aber eine ordentliche Struktur deiner Datenbank könnte da schon immens helfen.
Eine Tabelle mit Datum, Kennzeichen + den weiteren benötigten Infos (bspw. Benutzer, Kunde, ... was auch immer ihr da braucht) und dort steht dann das drin, was Du auslesen musst. Ich würde daher eine solche Tabelle aufsetzen und dann einmalig die Werte aus deiner Tabelle parsen und in die neue Tabelle übertragen.
Hier ein Beispiel, wie man die Werte umsetzen kann:
DECLARE @Year INT = 2019; DECLARE @Month INT = 1; DECLARE @Input varchar( 31 ) = 'FBBBWWAAAAAWWAAAAAWWAAAAAWWAAAA'; WITH Query( Number ) AS ( SELECT 1 UNION ALL SELECT Number + 1 From Query WHERE Number < LEN( @Input ) ) SELECT @Year AS Year, @Month AS Month, * FROM Query CROSS APPLY ( SELECT SUBSTRING( @Input, Number, 1 ) ) AS Result( Letter )
Falls deinerseits gleich der Einwand kommt "Kann die Datenbank nicht ändern": Solltest Du aber. Notfalls lass es jemanden machen, der das kann. Und falls es überhaupt nicht geht, kannst Du dir die Werte zwar auch in einer Tabellenvariablen merken, das Ganze muss dann aber wieder und wieder und wieder ausgeführt werden.
Wie kommt man eigentlich auf so eine Idee? Das wär mir wohl maximal zu Cobolzeiten in den Sinn gekommen und ob ich es gemacht hätte, sei dahingestellt. Aber in einem auf SQL basierenden System? Da gab es IMHO noch nie die Notwendigkeit, sowas zu basteln.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport- Als Antwort vorgeschlagen Christoph MuthmannEditor Mittwoch, 30. Oktober 2019 07:42
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Dienstag, 9. Juni 2020 14:03
Alle Antworten
-
Hi,
Kenn jemand evtl. Tricks um das zu realisieren oder kann mir paar Tipps geben? Über Hilfe wäre ich sehr dankbar. Muss ich evtl vorher alle Strings zusammen nehmen und damit hantieren?
"Trick" würde ich das zwar nicht nennen aber eine ordentliche Struktur deiner Datenbank könnte da schon immens helfen.
Eine Tabelle mit Datum, Kennzeichen + den weiteren benötigten Infos (bspw. Benutzer, Kunde, ... was auch immer ihr da braucht) und dort steht dann das drin, was Du auslesen musst. Ich würde daher eine solche Tabelle aufsetzen und dann einmalig die Werte aus deiner Tabelle parsen und in die neue Tabelle übertragen.
Hier ein Beispiel, wie man die Werte umsetzen kann:
DECLARE @Year INT = 2019; DECLARE @Month INT = 1; DECLARE @Input varchar( 31 ) = 'FBBBWWAAAAAWWAAAAAWWAAAAAWWAAAA'; WITH Query( Number ) AS ( SELECT 1 UNION ALL SELECT Number + 1 From Query WHERE Number < LEN( @Input ) ) SELECT @Year AS Year, @Month AS Month, * FROM Query CROSS APPLY ( SELECT SUBSTRING( @Input, Number, 1 ) ) AS Result( Letter )
Falls deinerseits gleich der Einwand kommt "Kann die Datenbank nicht ändern": Solltest Du aber. Notfalls lass es jemanden machen, der das kann. Und falls es überhaupt nicht geht, kannst Du dir die Werte zwar auch in einer Tabellenvariablen merken, das Ganze muss dann aber wieder und wieder und wieder ausgeführt werden.
Wie kommt man eigentlich auf so eine Idee? Das wär mir wohl maximal zu Cobolzeiten in den Sinn gekommen und ob ich es gemacht hätte, sei dahingestellt. Aber in einem auf SQL basierenden System? Da gab es IMHO noch nie die Notwendigkeit, sowas zu basteln.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport- Als Antwort vorgeschlagen Christoph MuthmannEditor Mittwoch, 30. Oktober 2019 07:42
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Dienstag, 9. Juni 2020 14:03
-
Erstmal danke für die schnelle Rückmeldung.
Danke das du das genauso siehst wie ich. Ich finde die Struktur/Aufbau der Tabelle genauso ätzend wie du. Mir wurde bloß die Aufgabe gestellt die Schichten etc zu errechnen über ein Zeitraum. An der Datenbank - Tabelle kann ich nichts ändern. Kann aber mal den Entwickler anschreiben und fragen ob die Struktur irgend ein Hintergrund hat und ob man es evtl ggf. anpassen könnte. Das ist glaube die sinnvollste Idee.
Mit freundlichen Grüßen
dash_
- Bearbeitet dash_ Dienstag, 29. Oktober 2019 09:12