Office: SQL-String erweitern

Helfe beim Thema SQL-String erweitern in Microsoft Access Hilfe um das Problem gemeinsam zu lösen; ich hab mal angekürzt: t = Tabellenname e = Stelle m = Mitarbeiter d = datum (egal ob von oder bis) TRANSFORM Count(t.m) AS [Anzahl von m] SELECT t.e,... Dieses Thema im Forum "Microsoft Access Hilfe" wurde erstellt von horse79, 13. April 2002.

  1. SQL-String erweitern


    ich hab mal angekürzt:
    t = Tabellenname
    e = Stelle
    m = Mitarbeiter
    d = datum (egal ob von oder bis)

    TRANSFORM Count(t.m) AS [Anzahl von m]
    SELECT t.e, t.m
    FROM t
    GROUP BY t.e, t.m
    PIVOT Format([d],"m") In (1,2,3,4,5,6,7,8,9,10,11,12);

    so long erwin...
     
  2. TRANSFORM Count(Einsatzplanung.PK_Azubi) AS [Anzahl von m]
    SELECT Einsatzplanung.PK_Einsatzstelle, Einsatzplanung.PK_Azubi
    FROM Einsatzplanung
    GROUP BY Einsatzplanung.PK_Einsatzstelle, Einsatzplanung.PK_Azubi
    PIVOT Format(#2001-01-01#,"m") In (1,2,3,4,5,6,7,8,9,10,11,12);

    Das füllt mir ja nur die Spalte 1 (Januar) aus. Wie bekomme ich das ganze Jahr in die Abfrage?

    Acess legt auch nicht nur eine Zeile für PK_Einsatzstelle an sondern viele...?
     
    horse79, 17. April 2002
    #32
  3. die Pivotisierung nach einer Konstanten (#2001-01-01#) ist natürlich Blödsinn - da muss entweder das VON- oder das BIS-Datum rein. Und das Problem mit den "vielen Azubis je Stelle", hab' ich doch oben schon angesprochen, das klappt IMHO mit reinem SQL nicht. Dh. du müstest zuerst eine Public-Function schreiben, welche dir bezogen auf eine Stelle + einen Monat alle Ma_Nrn.(Azubis) in einem String ausgibt - dann diese Fu. in eine gruppierte Abfrage (Stelle/Monat) einbauen + darauf dann die Kreuztab.Abfrage setzen.

    so long erwin...
     
  4. SQL-String erweitern

    aber im DatumVon würde doch auch nichts anderes stehen als #2001-01-01#, oder was müsste Deiner Meinung nach in die Variable?

    Mit der Funktion werde ich mal rumbasteln...
     
    horse79, 17. April 2002
    #34
  5. häää - in dem TABELLENFELD werden doch wohl auch andere Werte als #2001-01-01# sein - oder ?

    slg erwin...
     
  6. Uuups, ja natürlich. Ich bin jetzt von einer globalen Variable ausgegangen, so jetzt schaut das etwas besser aus:

    TRANSFORM Count(Einsatzplanung.PK_Azubi) AS [Anzahl von m]
    SELECT Einsatzplanung.PK_Einsatzstelle, Einsatzplanung.PK_Azubi
    FROM Einsatzplanung
    GROUP BY Einsatzplanung.PK_Einsatzstelle, Einsatzplanung.PK_Azubi
    PIVOT Format(Einsatzplanung.DatumVon,"m") In (1,2,3,4,5,6,7,8,9,10,11,12);

    Jetzt füllt er mir brav alle Monate aus...

    Mein Ergebnis:

    Es gibt für jede Einsatzstelle soviele DSe wie Azubis in diesem Jahr in der Stelle eingeplant sind. In jedem DS steht dann eine 1 in demjenigen Monat in dem der Azubi diese Stelle besucht...

    Jetzt habe ich leider noch nicht ganz verstanden was Du weiter oben meintest. Das bezog sich doch darauf, wenn in einem Monat mehrere Azubis in einer Einsatzstelle sind?

    Oder kann ich den SQL so setzen das er mir nur einen DS pro Einsatzstelle anzeigt und den PK_Azubi in die Felder 1-12 der Kreuztabelle schreibt. (Gehen wir mal davon aus dass nur EIN Azubi PRO Monat verteilt ist).

    Wenn ich dann mehrere pro Monat habe muß ich diese halt in einen String schreiben wie Du ja beschrieben hast, wenn meine Interpretation richtig war.

    Vielen Dank
     
    horse79, 17. April 2002
    #36
  7. Wenn dir EINER reicht bzw. in einem Monat sowieso nur EINER an EINER Stelle ist, dann kannst du doch auch eine beliebige Funktion (natürlich nicht Count *wink.gif* ) auf den Azubi anwenden und ihn als Zeilenüberschrift weglassen.

    zB. Min(Azubi) oder Max(Azubi) oder First(Azubi) würde klappen.

    Aber wie gesagt - auch wenn's mehrere sind, siehst du dann immer nur EINEN ! Für alle brauchst du die von mir o.a. Public-Function.

    so long erwin...
     
  8. SQL-String erweitern

    TRANSFORM First(Einsatzplanung.PK_Azubi) AS [Anzahl von m]
    SELECT Einsatzplanung.PK_Einsatzstelle
    FROM Einsatzplanung
    GROUP BY Einsatzplanung.PK_Einsatzstelle
    PIVOT Format(Einsatzplanung.DatumVon,"m") In (1,2,3,4,5,6,7,8,9,10,11,12);

    Dann kommt es so wie gewollt, dann werde ich mal mit der Funktion rumspielen.

    Vielen Dank erst mal...
     
    horse79, 17. April 2002
    #38
  9. Hallo,


    ich hab jetzt folgende Funktion geschrieben:

    Jetzt habe ich das Problem wie ich diese Funktion in die Abfrage einbaue?

    Kannst Du mir da helfen?
    Ich hab da leider nur Syntaxfehler bekommen.
    Im VBA mit Übergabe der beiden Parameter funktioniert diese ohne Probleme...

    Vielen Dank

    Sven
     
    horse79, 22. April 2002
    #39
  10. ganz einfach:

    SELECT Jahresplan(DatumVon, PK_Einsatzstelle), .... FROM ...

    oder was geht nicht ?

    so long erwin...
     
  11. eigentlich schon...

    Dann zeigt er mir das richtig...

    Aber wie bring ich da die Kreuztabelle drauf:


    Die erste Abfrage liefert mir ja die Namen für einen Monat als String. z.B.:
    3 DS:
    DS1: Azubi 1
    DS2: Azubi 3
    DS3: Azubi 2 und Azubi 14

    Da bin ich noch ein bischen ratlos...
     
    horse79, 22. April 2002
    #41
  12. hab' ich doch "oben" schon geschrieben:

    ...dann diese Fu. in eine gruppierte Abfrage (Stelle/Monat) einbauen + darauf dann die Kreuztab.Abfrage setzen.

    Also erst noch eine Query nach Stelle, JJJJ-MM, und DeineFu(...) gruppierte Abfrage, darauf dann die Kreuztab.Abfrage.

    so long erwin...
     
  13. SQL-String erweitern

    OK, das habe ich hinbekommen...

    Jetzt hab ich nur noch ein riesen Performance-Problem.

    Folgende Funktion berechnet meine freien Einsatzstellen mit Anzahl der Tage pro Monat um die Datenherkunft für das Listenfeld herzustellen. Diese wird im Formular immer ausgelöst, wenn man einen anderen Monat auswählt. Also recht oft.

    Nur steigt die DB-Größe bei jedem ausführen um 40 KB. Ich denke das hängt damit zusammen, dass per SQL 4 Tabellen bearbeitet werden. Wie kann ich das schneller machen und die Aufblähung verhindern? Geht das auch per Recordset?

    Hier meine Funktion:

    Public Function unverplanteTageEinerEinsatzstzelleEinesMonates()

    DoCmd.SetWarnings False

    'schritt1
    Dim DerTagVar As Variant
    Dim Bedingung As Variant
    Dim JAHRESZAHL As Variant
    JAHRESZAHL = Right(Forms!frmEinsatzplanung!Datum, 4)

    If IsNull(JAHRESZAHL) Then
    MsgBox "Bitte wählen Sie ein Datum aus...", vbInformation
    Exit Function
    End If

    DerTagVar = "DateSerial(" & JAHRESZAHL & ", MonatX, TagX)"
    Bedingung = "IsDate(" & JAHRESZAHL & " & ' - ' & MonatX & ' - ' & TagX)"
    DoCmd.RunSQL "SELECT " & DerTagVar & " AS DerTag INTO Temp_Schritt1 FROM HilfsMonate, HilfsTage WHERE " & Bedingung & ";"

    'schritt2
    Monat = Forms!frmEinsatzplanung!Datum
    AnfangUndEndeEinesMonatesBerechnen (Monat)
    'die Variablen GLOBALAnfangMonat und GLOBALEndeMonat werden durch vorige Funktion gefüllt
    DoCmd.RunSQL "SELECT PK_Einsatzstelle, DerTag INTO Temp_Schritt2 FROM Einsatzstellen, Temp_Schritt1 WHERE DerTag between " & GLOBALAnfangMonat & " and " & GlobalEndeMonat & ";"

    'schritt3
    DoCmd.RunSQL "SELECT * INTO Temp_Schritt3 FROM Temp_Schritt2 AS A WHERE (((Exists (SELECT * FROM Einsatzplanung B WHERE B.PK_Einsatzstelle = A.PK_Einsatzstelle AND A.DerTag BETWEEN B.DatumVon AND B.DatumBis))=False));"

    'schritt4
    Forms!frmEinsatzplanung!Liste4.RowSource = "" 'Tabelle freigeben

    DoCmd.RunSQL "SELECT DISTINCTROW First(Temp_Schritt3.PK_Einsatzstelle) AS [ErsterWert von PK_Einsatzstelle], Einsatzstellen.Name, Count(Temp_Schritt3.DerTag) AS unverplanteTage INTO Temp_Schritt4 FROM Temp_Schritt3 INNER JOIN Einsatzstellen ON Temp_Schritt3.PK_Einsatzstelle = Einsatzstellen.PK_Einsatzstelle GROUP BY Einsatzstellen.Name;"

    Forms!frmEinsatzplanung!Liste4.RowSource = "Temp_Schritt4"

    End Function

    Vielen Dank

    Sven
     
    horse79, 29. April 2002
    #43
  14. huch - was treibst du denn da !

    so wie ich das sehe müsste man doch nur in der (oben geposteten) Query "AlleTageUndStellen" die Tage auf einen Monat + ggf. auch noch die Einsatzstelle einschränken - ich sehe da niergends eine Notwendigkeit mit temp.Tab's zu arbeiten ?!

    Select PK_Einsatzstelle, DerTag
    FROM Einsatzstellen, AlleTage
    WHERE DerTag BETWEEN PublicFuVon() AND PublicFuBis();

    mit 2 Public Functions, die dir das VON- BIS-Datum (=gobals / public Var.) als String mit Trennz. i.d. Form "#yyyy-mm-dd#" zurückgeben.

    Auf dieser Query "AlleTageUndStellen" dann eben - wie auch schon gepostet - noch gruppieren + ausschliessen ca. so:

    SELECT A.PK_Einsatzstelle, count(*) AS AnzahlTageUngeplant
    FROM AlleTageUndStellen A
    WHERE NOT EXISTS
    (SELECT * FROM tblPlanungAbfrage B
    WHERE B.PK_Einsatzstelle = A.PK_Einsatzstelle
    AND A.DerTag BETWEEN B.DatVon AND B.DatBis)
    GROUP BY A.PK_Einsatzstelle;

    so long erwin...
     
  15. Dann muß aber die Query AllleTageundStellen als Abfrage gespeichert sein? Ich hatte das Problem und wollte halt schritt für schritt auf den SQL-Strings aufbauen. Also in Schritt 2 ...From SQL1... und in Schritt 3 ...From SQL2...

    Aber das ging irgendwie nicht. Und Variablen hab ich irgendwie nicht in einer gespeicherten Query zum laufen gebracht. Das hat nur in VBA hingehaut. Drum die obere Lösung...

    Könntest Du mir das genauer erklären? Da steh ich noch aufm Schlauch...

    [ 29. April 2002: Beitrag editiert von: horse79 ]
     
    horse79, 29. April 2002
    #45
Thema:

SQL-String erweitern

Die Seite wird geladen...
  1. SQL-String erweitern - Similar Threads - SQL String erweitern

  2. Benötige Hilfe bei SQL-Befehl

    in Microsoft Access Hilfe
    Benötige Hilfe bei SQL-Befehl: Hallo zusammen und alles Gute für 2025 Es ist mal wieder Sale-Zeit und jetzt müssen bei vielen Artikel zu eine festgesetzten Zeit die VK-Preise geändert werden. Man kann das in unserem...
  3. Steuerelement SQL-String mit Datumsabfrage

    in Microsoft Access Hilfe
    Steuerelement SQL-String mit Datumsabfrage: Hallo, mach ich zwar selten, aber ich muss einem Listenfeld direkt im Steuerelement einen SQL-String als Referenz eintragen. Ich bekomme es einfach nicht hin, dass er einen Datumsvergleich mit...
  4. Tabelle in VBA via SQL String erstellen

    in Microsoft Access Hilfe
    Tabelle in VBA via SQL String erstellen: Hallo zusammen! ich würde gerne via VBA Prozedure eine Tabelle vorerst löschen und dann neu erstellen. Bislang habe ich dies immer auf Basis einer Bestehenden Anfrage gemacht was auch super...
  5. Textfeld Datenherkunft aus SQL String

    in Microsoft Access Hilfe
    Textfeld Datenherkunft aus SQL String: Hallo, in einem Formular benötige ich ich ein Textfeld mit dieser Datenherkunft. strSql = "SELECT [anbieter] & "" - "" & [videoname] AS Websuche " & vbCrLf & _ "FROM tbl_anbieter INNER JOIN...
  6. Maximale Länge eines SQL Strings ??

    in Microsoft Access Hilfe
    Maximale Länge eines SQL Strings ??: Hallo Ich hab eine Problem.. Ich hab eine Art Baumstruktur von Daten. In einer Tabelle enthalten manche Datensätze den Primärschlüsselwert eines übergeordneten Datensatzes u.s.w.... Ich baue...
  7. Hochkomma in SQL String bei late Binding af DB

    in Microsoft Excel Hilfe
    Hochkomma in SQL String bei late Binding af DB: Hallo zusammen! Ich habe heute eine Fehlermeldung bekommen, als in einem Text, der aus Excel an eine DB übermittelt wird ein Hochkomma enthalten ist. Kennt jemand für das Problem eine Lösung? Im...
  8. SQL ODBC String für VBA Verbindung

    in Microsoft Access Hilfe
    SQL ODBC String für VBA Verbindung: Hallo zusammen, ich habe ein Programm geschrieben - das bis dato nur mit ACCDB Tabellen verbunden war. Nun habe ich aber einen Kunden - der hin und wieder gewisse Daten auf seinen SQL Server...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden