MS-Office-Forum
Google
   

Zurück   MS-Office-Forum > Microsoft Access & Datenbanken > Microsoft Access
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads Der Renner, 11 Entwicklertools für Access, Tipps & Trick und offene Datenbanken zum einzigartigen Preis.
Themen-Optionen Ansicht
Alt 11.01.2017, 13:52   #1
pxspezi
MOF User
MOF User
Standard SQL - Gruppierung mit Bedinung

Hallo zusammen,

wenn ich in eine Abfrage die Gruppiert ist, eine Bedingung hinzufüge, erhalte ich immer den Fehler „Datentypenkonflikt im Kriterienbereich“.
Es ist richtig, dass es im Kriterienbereich auch „NULL“ Werte gibt da ich zwei Tabellen miteinander vergleichen möchte (Soll/Ist). Das Kriterium ist ein Datumswert.
Also f.NUW kann auch nichts enthalten da es einfach keinen Datensatz hierfür gibt.

WHERE f.NUW>=Date()

Danke vorab.

Grüße
pxspezi ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.01.2017, 14:06   #2
elmar
MOF Meister
MOF Meister
Standard

Zeige doch bitte mal den gesamten SQL_String

__________________

WIN 7 PROF 64, ACCESS 2003 Wissenswertes: ACCESS-FAQ *** Habe mit ACC2007/10/13 nichts am Hut...
Hilfreiche Antworten kann es nur bei verständlichen Fragen geben! Anleitung dazu: Hier klicken | Auch hilfreich: Einführung in die Datenbank Microsoft Access.
elmar ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.01.2017, 14:10   #3
pxspezi
Threadstarter Threadstarter
MOF User
MOF User
Standard

Anbei der SQL-Code

Code:

SELECT 
	m.unmaLZRefID, 
	m.unmaUWRefID, 
	m.unmaSoll, 
	Count(f.unpePersRefID) AS AnzahlvonunpePersRefID
FROM tblUnPeMatrix AS m 
LEFT JOIN qryFortbildungenAktuell AS f 

ON (m.unmaUWRefID = f.unpeUnterRefID) 
AND (m.unmaLZRefID = f.lzpeLZRefID)

WHERE (((f.NUW)>=Date()))

GROUP BY m.unmaLZRefID, m.unmaUWRefID, m.unmaSoll;
pxspezi ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.01.2017, 14:11   #4
maikek
MOF Guru
MOF Guru
Standard

Versuch's so:
Code:

WHERE nz(f.NUW, date()-1) >= Date()
wenn die Nullwerte nicht gezeigt werden sollen und so
Code:

WHERE nz(f.NUW, date()) >= Date()
wenn du sie sehen willst.
maike

__________________

Bitte dein Thema auf erledigt setzen, wenn's durch ist!
MOF Access Stammtisch in Bremen
maikek ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.01.2017, 14:16   #5
pxspezi
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hat leider nicht funktioniert, habe das auch schon probiert

Habe es so erstellt, das gefällt mir aber nicht, da ich später das Datum durch ein Formular den Benutzer setzen lassen möchte und mit dieser Abfrage würde das ja nicht funktionieren :/

Code:

SELECT 
	m.unmaLZRefID, 
	m.unmaUWRefID, 
	m.unmaSoll, 
	q.AnzahlvonunpePersRefID

FROM tblUnPeMatrix AS m 

LEFT JOIN (SELECT 
    qryFortbildungenAktuell.lzpeLZRefID,
    qryFortbildungenAktuell.unpeUnterRefID,
    Count(qryFortbildungenAktuell.unpePersRefID) AS AnzahlvonunpePersRefID
	
FROM qryFortbildungenAktuell

WHERE qryFortbildungenAktuell.NUW >= Date()

GROUP BY 
    qryFortbildungenAktuell.lzpeLZRefID, 
    qryFortbildungenAktuell.unpeUnterRefID

)  AS q ON (m.unmaUWRefID = q.unpeUnterRefID) AND (m.unmaLZRefID = q.lzpeLZRefID);
pxspezi ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.01.2017, 14:44   #6
ebs17
MOF Guru
MOF Guru
Standard

Code:

WHERE f.NUW >= Date()
Das Kriterium muss funktionieren, wenn NUW vom Datentyp Date ist. Mit NULL kann SQL (im Unterschied zu diversen VBA-Gestaltungen) gut umgehen.

Alles andere spielt keine Rolle. NULL-Werte entfallen bei einem Vergleich automatisch, da man mit NULL nicht vergleichen kann.
Die WHERE-Klausel wird dann vor dem Gruppieren ausgeführt, somit hat das Gruppieren keinen Einfluss auf das Filtern.

Ergänzung: NULL für NUW kann auftreten, weil es in der Abfrage qryFortbildungenAktuell NULL ist aber auch, weil durch den OUTER JOIN keine Feldanteile aus qryFortbildungenAktuell geliefert werden. Im Extremfall könnten unterschiedliche Ergebnisse auftreten, je nach dem, ob der Ablaufplan erst das Filtern oder erst das Joinen vorsieht.

Zur Sicherstellung würde man die Abfrage qryFortbildungenAktuell mit ihrer eigenen SQL-Anweisung hier einbauen und darin den Filter vornehmen.

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}
Dein Dankeschön: DBWiki=>Spende

Geändert von ebs17 (11.01.2017 um 15:15 Uhr).
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.01.2017, 15:10   #7
pxspezi
Threadstarter Threadstarter
MOF User
MOF User
Standard

Ich verstehe das gerade nicht :/
NUW ist in der Abfrage qryFortbildungenAktuell und wird wie folgt erstellt:
Code:

NUW: DatAdd("m";[tblUnterweisungen].[unteIntervallMonate];[tblunpe].[unpeDatum])
Im #5 von mir funktioniert das mit dem Filter, die Abfrage gefällt mir aber nicht (siehe Post-Beschreibung) daher die Abfrage wie in #3

Geändert von pxspezi (11.01.2017 um 15:12 Uhr).
pxspezi ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 12.01.2017, 07:53   #8
pxspezi
Threadstarter Threadstarter
MOF User
MOF User
Standard

@ebs17
Moin, jetzt habe ich es verstanden (denke ich zumindest).
Also die Abfrage wie ich es in Post #5 gemacht habe, wäre dann richtig, denn hier mache ich den Filter?
pxspezi ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 12.01.2017, 08:59   #9
ebs17
MOF Guru
MOF Guru
Standard

Zitat:

Also die Abfrage wie ich es in Post #5 gemacht habe, wäre dann richtig

Wenn die SQL-Anweisung selber ohne Fehler ausgeführt wird und dann noch das erwartete richtige Ergebnis erscheint, kann ja das Ganze nicht falsch sein.

Aber auch: die Richtung, die ich meinte, stimmt.
Jetzt wird nämlich erst die rechte Seite des LEFT JOIN gefiltert und anschließend gruppiert (was die Datenmenge deutlich reduziert) und danach erst mit der anderen Tabelle gejoint. Bei aufwändigeren Operationen wie JOIN wird man da schnell mal auch zeitliche Einsparungen erleben.

Persönlich habe ich es mir angewöhnt, Abfragen aus rein Tabellen aufzubauen. In Deiner Abfrage ist die Abfrage qryFortbildungenAktuell enthalten, für den Außenstehenden ein unbekanntes Wesen. Ggf. sind da Ungeschicklichkeiten enthalten (z.B. eine Sortierung wäre an der Stelle unnütz aber zeitverbrauchend), andererseits könnte man vielleicht die datenmengenreduzierende Filterung bereits eine Stufe niedriger und damit effizienter einbauen.

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}
Dein Dankeschön: DBWiki=>Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 12.01.2017, 09:12   #10
pxspezi
Threadstarter Threadstarter
MOF User
MOF User
Standard

@ebs17 Ok. Danke dir
pxspezi ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.01.2017, 13:00   #11
pxspezi
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hallo zusammen,

leider ist der Weg nicht ganz der Richtige den ich bei der Abfrage gefahren bin.

Ich versuche euch erstmal meine Ausgangssituation zu erklären.
Es gibt eine tabelle (tblMatrix) in der ich zu jeden Bereich und zu jeder Unterweisung den Soll habe (wie viele Personen in welchen Bereich eine Fortbildung haben sollten)

ID; unmaLZRefID (Bereich); unmaUWRefID (Unterweisung/Fortbildung); unmaSoll


Nun habe ich auch eine Tabelle (tblUnPe).
Hier sind die Personen gepflegt, die eine Unterweisung/Fortbildung erhalten haben (Datum wann die UW/Fb. erhalten wurde und bis wann diese gültig ist (Spaltenname NUW)).

Wenn ich nun folgende Abfrage ausführe, erhalte genau die Anzahl der Personnen, die zum Bestimmten Datum eine UW/Fb. erhalten haben.

Code:

SELECT f.lzpeLZRefID,
       f.unpeUnterRefID,
       Count(f.unpePersRefID) AS AnzahlPersonen

FROM qryFortbildungenAlle AS f

WHERE (((f.unpeDatum)<=DateValue("01.01.2015"))
       AND ((f.NUW)>=DateValue("01.01.2015")))

GROUP BY f.lzpeLZRefID,
         f.unpeUnterRefID;

Wenn ich jetzt den Vergleich haben möchte (Soll/Ist) und die Abfrage mit einem LEFT JOIN versehe, erhalte ich nur die Datensätze, wie aus der ersten Abfrage und nicht alle Daten, die in der Tabelle „tblMatrix“ enthalten sind.

Code:

SELECT tblUnPeMatrix.unmaLZRefID,
       tblUnPeMatrix.unmaUWRefID,
       tblUnPeMatrix.unmaSoll,
       Count(f.unpePersRefID) AS AnzahlPersonen

FROM tblUnPeMatrix

LEFT JOIN qryFortbildungenAlle AS f 

ON (tblUnPeMatrix.unmaUWRefID = f.unpeUnterRefID)
AND (tblUnPeMatrix.unmaLZRefID = f.lzpeLZRefID)

WHERE (((f.unpeDatum)<=DateValue("01.01.2015"))
       AND ((f.NUW)>=DateValue("01.01.2015")))

GROUP BY tblUnPeMatrix.unmaLZRefID,
         tblUnPeMatrix.unmaUWRefID,
         tblUnPeMatrix.unmaSoll;
Was mache ich hier falsch?

Grüße

Geändert von pxspezi (16.01.2017 um 13:26 Uhr).
pxspezi ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 17.01.2017, 18:44   #12
pxspezi
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hallo zusammen,

anbei eine die DB. Vielleicht ist es besser so mein Problem zu erklären.
Die Abfrage Soll/Ist liefert nicht alle Ergebnisse aus der Matrix-Tabelle.

Ich möchte nur eine Gegenüberstellung haben, zu einem Stichtag (Bsp. 01.01.2015) wer eine Unterweisung hat bzw. nicht, für jeden Bereich.
Danke euch vorab.
Angehängte Dateien
Dateityp: zip TestV1.zip (27,4 KB, 10x aufgerufen)
pxspezi ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 18.01.2017, 21:08   #13
pxspezi
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hallo,

mittlerweile habe ich es fast geschafft.

Das Having funktioniert nicht bzw. die Bedinung kennt die Tabelle m. nicht.
Wie kann ich diesen Fehler beheben?

Grüße

Code:

SELECT m.unmaLZRefID,
       m.unmaUWRefID,
       m.unmaSoll,

  (SELECT count(*)
   FROM
     ( SELECT qryUWAlle.unpePersRefID,
              qryUWAlle.lzpeLZRefID,
              qryUWAlle.unpeUnterRefID
      FROM qryUWAlle
      WHERE (((qryUWAlle.unpeDatum)<=DateValue("01.01.2012"))
             AND ((qryUWAlle.NUW)>=DateValue("01.01.2012")))
      GROUP BY qryUWAlle.unpePersRefID,
               qryUWAlle.lzpeLZRefID,
               qryUWAlle.unpeUnterRefID
      HAVING (((qryUWAlle.lzpeLZRefID)=m.unmaLZRefID)
              AND ((qryUWAlle.unpeUnterRefID)=m.unmaUWRefID)) )) AS qa
FROM tblUnPeMatrix AS m;
pxspezi ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 19.01.2017, 09:35   #14
ebs17
MOF Guru
MOF Guru
Standard

Umformulierung der Abfrage:
- Die Bedingungen aus HAVING gehören in den WHERE-Teil.
- Das Nur-Zählen kann man unmittelbar zusammen mit dem Gruppieren erledigen. Das erspart eine Verschachtelungsebene.
- Beseitigung einiger unnützer Klammern.
Code:

SELECT 
   m.unmaLZRefID, 
   m.unmaUWRefID, 
   m.unmaSoll, 
   (
      SELECT 
         COUNT(*) 
      FROM 
         qryUWAlle 
      WHERE 
         qryUWAlle.unpeDatum <= DateValue("01.01.2012") 
            AND 
         qryUWAlle.NUW >= DateValue("01.01.2012") 
            AND 
         qryUWAlle.lzpeLZRefID = m.unmaLZRefID 
            AND 
         qryUWAlle.unpeUnterRefID = m.unmaUWRefID 
      GROUP BY 
         qryUWAlle.unpePersRefID, 
         qryUWAlle.lzpeLZRefID, 
         qryUWAlle.unpeUnterRefID 
   ) AS qa 
FROM 
   tblUnPeMatrix AS m
So läuft die Abfrage ohne Laufzeitfehler. Zur Logik machte ich mir keine Gedanken, schon weil es zu mühselig ist. Tabellenabhängigkeiten würde ich aus einem Beziehungsbild ableiten (hier nicht vorhanden) und kaum aus verschachtelten Abfragen, wenn dann die Tabellenanzahl etwas höher ist.

__________________

Ein freundliches Glück Auf!

Eberhard

Abfrageperformance ist kein Geheimnis
SQL ist leicht: {0}:{1}:{2}:{3}:{4}:{5}:{6}:{7}:{8}:{9}
Dein Dankeschön: DBWiki=>Spende
ebs17 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 19.01.2017, 10:21   #15
pxspezi
Threadstarter Threadstarter
MOF User
MOF User
Standard

Hallo @ebs17,

vielen Dank für deine Unterstützung.
Die Abfrage funktioniert soweit.
Nun habe ich nur ein Problem, es gibt Datensätze, in dem sich das Datum überlapt.

Bsp.:

Code:

1000	MusterM	Muster	Max	Bereich A	Ersthelfer	01.01.2012	01.01.2014
1000	MusterM	Muster	Max	Bereich A	Ersthelfer	02.01.2010	02.01.2012
Ich möchte das dieser nur 1x gezählt wird. Habe es auch schon mit Distinct probiert, hat leider nicht funktioniert.

Grüße
pxspezi ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:54 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Copyright ©2000-2010 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günther Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.
Beachten Sie bitte auch unsere Nutzungsbedingungen.