none
Filtern, anhand eines Datums bei begrenzten Informationen RRS feed

  • 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_

    Dienstag, 29. Oktober 2019 07:01

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

    Dienstag, 29. Oktober 2019 07:33
    Moderator

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

    Dienstag, 29. Oktober 2019 07:33
    Moderator
  • 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
    Dienstag, 29. Oktober 2019 09:07