collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 66
  • Punkt Versteckte: 0
  • Punkt Mitglieder: 1
  • Punkt Benutzer Online:

* Forenstatistik

  • stats Mitglieder insgesamt: 14136
  • stats Beiträge insgesamt: 68396
  • stats Themen insgesamt: 9212
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 17
  • stats Am meisten online: 415

Autor Thema: SQL Abfrage mit mehreren "And" und "Or"  (Gelesen 862 mal)

Offline ChickenWing

  • Newbie
  • Beiträge: 34
SQL Abfrage mit mehreren "And" und "Or"
« am: März 22, 2018, 08:48:36 »
Hallo allerseits,

ich stecke irgendwie vollkommen fest.
SELECT lnx_lo_lohnarten_summen_neu.nr_personal_lasum, lnx_lo_personal_stamm.name_familie, lnx_lo_personal_stamm.vorname, lnx_lo_lohnarten_summen_neu.tag_lasum, lnx_lo_lohnarten_summen_neu.std_lasum, lnx_lo_lohnarten_summen_neu.la_nr_lasum, lnx_lo_lohnarten_summen_neu.kst_ktr1_lasum, lnx_lo_personal_stamm.geburt_datum
FROM lnx_lo_lohnart_stamm INNER JOIN (lnx_lo_personal_stamm INNER JOIN lnx_lo_lohnarten_summen_neu ON lnx_lo_personal_stamm.nr_personal_stamm = lnx_lo_lohnarten_summen_neu.nr_personal_lasum) ON lnx_lo_lohnart_stamm.nr_la = lnx_lo_lohnarten_summen_neu.la_nr_lasum
WHERE (((lnx_lo_lohnarten_summen_neu.tag_lasum)<>0)
AND ((lnx_lo_lohnarten_summen_neu.la_nr_lasum)=11 Or (lnx_lo_lohnarten_summen_neu.la_nr_lasum)=12 Or (lnx_lo_lohnarten_summen_neu.la_nr_lasum)=13 Or (lnx_lo_lohnarten_summen_neu.la_nr_lasum)=14 Or (lnx_lo_lohnarten_summen_neu.la_nr_lasum)=822)
AND ((lnx_lo_lohnarten_summen_neu.jahr_lasum)=[Geben Sie das Jahr ein:])
AND ((lnx_lo_lohnarten_summen_neu.monat_lasum)=[Geben Sie den Monat als Zahl ein:])
AND ((lnx_lo_personal_stamm.personengruppe)=102));

An sich funktioniert auch alles Einwandfrei, ausser die Stelle mit den vielen "Or".
Ich bin mir noch nicht ganz sicher, ob er es einfach völlig ignoriert oder nur teilweise ausführt, aber so oder so scheint da
ein Fehler drin zu stecken.
Z.B. kommt die 972 immer wieder mit durch =/
Eine Fehlermeldung gibt es nicht, er macht brav seine abfrage.

Hat jemand eine Idee?

Vielen lieben Dank =)

Gruß
Max
----------------------
Mit freundlichen Grüßen

Max
 

Offline Lachtaube

  • Access Guru
  • ****
  • Beiträge: 1432
Re: SQL Abfrage mit mehreren "And" und "Or"
« Antwort #1 am: März 22, 2018, 09:22:26 »
Sind die Felddatentypen, in den im Kriterium Zahlen stehen auch alle Zahlenfelder?SELECT s.nr_personal_lasum,
       p.name_familie,
       p.vorname,
       s.tag_lasum,
       s.std_lasum,
       s.la_nr_lasum,
       s.kst_ktr1_lasum,
       p.geburt_datum
FROM   lnx_lo_personal_stamm AS p
       LEFT JOIN lnx_lo_lohnarten_summen_neu AS s
              ON p.nr_personal_stamm = s.nr_personal_lasum
WHERE  s.tag_lasum > 0 AND
       s.la_nr_lasum IN( 11, 12, 13, 14, 822 ) AND
       s.jahr_lasum = [Geben Sie das Jahr ein:] AND
       s.monat_lasum = [Geben Sie den Monat als Zahl ein:] AND
       p.personengruppe = 102;
Grüße von der (⌒▽⌒)
 
Folgende Mitglieder bedankten sich: ChickenWing

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 951
Re: SQL Abfrage mit mehreren "And" und "Or"
« Antwort #2 am: März 22, 2018, 09:38:30 »
Abseits von der eleganten und zu bevorzugenden Lösung mit IN(...):
AND bindet mehr als OR. Eine OR-Verknüpfung müsste man also zur Ausführung der gewünschten Logik gezielt klammern.

Dabei wird es günstig sein, vorher die vielen überflüssigen Klammern, die der Abfrageeditor erzeugt, zu beseitigen, um eher Überblick zu bekommen. Auch das zeigt ja Lachtaube.
Mit freundlichem Glück Auf!

Eberhard
 
Folgende Mitglieder bedankten sich: ChickenWing

Offline ChickenWing

  • Newbie
  • Beiträge: 34
Re: SQL Abfrage mit mehreren "And" und "Or"
« Antwort #3 am: März 22, 2018, 10:26:10 »
Eine ganz neue Welt 0.0

SQL fällt bei mir noch unter Fremdsprache.

Dein Post ist super hilfreich Lachtaube. Ich hatte keine Ahnung , dass ich mit AS ähnlich VBA Kürzel definieren kann. Genauso, dass die Klammern nicht wichtig sind, wusste ich nicht. Dachte der Abfrageeditor braucht die irgendwie. (Wobei... wenn man Makros aufzeichnet in Excel kann man ja auch erstmal die hälfte wegschmeißen, hätte ich mir denken können).
Auch IN ist mir neu... Super Sache, werde ich nachher noch an anderen Stellen nutzen können =)

Ich hab den Code jetzt einfach mal in meine Abfrage kopiert und eingesetzt und Daten von 2 verschiedenen Monaten gezogen.

Ergebnis:

Für das Feld la_nr_lasum kommen immer noch die Werte 100 und 972 mit. - Ist das das Problem was du meintest ebs17? Das hab ich nämlich noch nicht so ganz kapiert.

Die Felddefinitionen stimmen, sind alle als Zahl hinterlegt.

Trotzdem schonmal vielen Dank =)
----------------------
Mit freundlichen Grüßen

Max
 

Offline Lachtaube

  • Access Guru
  • ****
  • Beiträge: 1432
Re: SQL Abfrage mit mehreren "And" und "Or"
« Antwort #4 am: März 22, 2018, 10:51:33 »
Hm, das dürfte eigentlich nicht sein. Kannst Du einige (anonymisierte) Spieldatensätze in Textform zur Verfügung stellen?

PS: der Left-Join mit den Kriterien aus meiner ersten Antwort scheint so sinnvoller formuliert zu sein:SELECT q.nr_personal_lasum,
       p.name_familie,
       p.vorname,
       q.tag_lasum,
       q.std_lasum,
       q.la_nr_lasum,
       q.kst_ktr1_lasum,
       p.geburt_datum
FROM   lnx_lo_personal_stamm AS p
       LEFT JOIN ( SELECT nr_personal_lasum,
                          tag_lasum,
                          std_lasum,
                          la_nr_lasum,
                          kst_ktr1_lasum
                   FROM   lnx_lo_lohnarten_summen_neu
                   WHERE  tag_lasum > 0 AND
                          la_nr_lasum IN( 11, 12, 13, 14, 822 ) AND
                          jahr_lasum = [Geben Sie das Jahr ein:] AND
                          monat_lasum = [Geben Sie den Monat als Zahl ein:] ) AS q
              ON p.nr_personal_stamm = q.nr_personal_lasum
WHERE  p.personengruppe = 102;
Grüße von der (⌒▽⌒)
 

Offline ChickenWing

  • Newbie
  • Beiträge: 34
Re: SQL Abfrage mit mehreren "And" und "Or"
« Antwort #5 am: März 22, 2018, 11:34:18 »
Zuerst zu der neuen Left Join:
Es muss ein Right Join sein, auch wenn es eher konterintuitiv ist.

Ich hol mal etwas weiter aus um was es eigentlich geht:

Die Tabellen sind alle verknüpft zu einem Server per ODBC-Schnittstellen. Ich kann nur lesen, nicht schreiben.

Die Tabelle lnx_lo_personal_stamm ist, wie sie ja auch heißt, mein Personalstamm. Hier werden über die Personalnummer als Primärschlüssel alle Mitarbeiter mit ihren Stammdaten (geburtsdatum, name, personengruppe...) geführt.

Die Tabelle lnx_lo_lohnarten_summen_neu erfasst die gearbeiteten Stunden der Mitarbeiter.

Die Tabelle listet im Prinzip:
Personalnummer    Jahr       Monat     Tag     Stunden     Lohnart     Kostenträger
        123              2018           1         1            5             12              36
        123              2018           1          1           3             12              36
        123              2018           1          2           8             822            29
        567              2018           1          2            8             14             120

Ziel der Abfrage ist es mir alle Stunden für einen Monat zu ziehen, aufgeschlüsselt nach Mitarbeiter und Datum um in Excel eine Auswertung damit zu machen. Es geht drum zu sehen Mitarbeiter 123 hat am 01.01.2018 8 Stunden gearbeitet. Hier sind die Lohnarten eigentlich fast egal, das Problem ist nur das es Buchungen auf Lohnarten gibt, die meine Auswertung verfälschen. Deshalb auch die Filter nach 11,12,13,14,822.
Die Auswertung funktioniert soweit auch(Ist simpel über Pivot und bedingte Formatierungen umgesetzt)
Der Personalstamm dient mit mir lediglich dazu den Namen herauszufinden und nur die Personengruppe 102 zu ziehen.

Im Prinzip brauche ich einfach nur die lo_lohnarten_summe_neu um die Namen ergänzt und nur die Mitarbeiter der Gruppe 102 und die Filterung der Lohnarten. Mitarbeiter die keine Daten in lo_lohnarten_summe_neu haben interessieren mich nicht weiter, die möchte ich sowieso nicht im Abfrageergebnis haben.

Ich hoffe ich hab nichts wichtiges vergessen.

----------------------
Mit freundlichen Grüßen

Max
 

Offline Lachtaube

  • Access Guru
  • ****
  • Beiträge: 1432
Re: SQL Abfrage mit mehreren "And" und "Or"
« Antwort #6 am: März 22, 2018, 12:20:17 »
OK, dann wäre aber die erste Abfrage (nur statt eines LEFT- einen INNER JOIN) AFAIK korrekt.

Um das Problem einzugrenzen, verwende einmal nur die Bedingung mit der IN-Klausel. Wenn das nicht hilft, importiere einige der relevanten Daten vom Server in eine neue leere DB und teste, ob es lakal zu den gleichen Problemen kommt. Ist das nicht der Fall, dürfte es am ODBC-Treiber liegen, der vielleicht eine entsprechende Stellschraube zur Korrektur aufweist oder aber vielleicht auch in einer verbesserten Version zu haben ist.
Grüße von der (⌒▽⌒)
 

Offline ChickenWing

  • Newbie
  • Beiträge: 34
Re: SQL Abfrage mit mehreren "And" und "Or"
« Antwort #7 am: März 23, 2018, 11:00:02 »
Ich hab mal etwas getestet.
Nur mit der IN Bedingung funktioniert es auch nicht - Auch nicht wenn ich mir die Daten vorher lokal als Tabelle gespeichert hab... Ich bin langsam mehr als verwirrt. Vor Allem weil es großteils funktioniert und nur ein paar vereinzelte Datensätze "durchrutschen".

Ich werde das Problem jetzt zu Lasten meiner User ändern, da mir die Zeit fehlt jetzt auf ewige Fehlersuche zu gehen.
Die drücken eh nur auf einen Knopf im Formular und bekommen eine Exceltabelle zurück. Da muss dann halt mit Filtern oder ähnlichem gearbeitet werden oder ich bau noch fix was in VBA zusammen.

Trotzdem vielen Dank für die Hilfe, ich lasse den Thread nochmal offen und schließe ihn Anfang nächster Woche, falls sich noch jemand zu Wort melden will.

Vielen Dank!!!
----------------------
Mit freundlichen Grüßen

Max
 

Offline Lachtaube

  • Access Guru
  • ****
  • Beiträge: 1432
Re: SQL Abfrage mit mehreren "And" und "Or"
« Antwort #8 am: März 23, 2018, 11:23:03 »
Ich behaupte, dass ein Defekt vorliegt, wenn die IN-Klausel nicht funktioniert. Die folgende Tabelle t
 
t
txtnum
A
11
B
11
A
6
B
12
C
15
C
14
D
822
D
823
mit
SELECT t.txt, t.num
FROM   t
WHERE  t.num IN ( 11, 12, 13, 14, 822 );
ergibt bei mir erwartungsgemäß
 
Query1 
txtnum
A
11
B
11
B
12
C
14
D
822
Grüße von der (⌒▽⌒)
 

Offline ChickenWing

  • Newbie
  • Beiträge: 34
Re: SQL Abfrage mit mehreren "And" und "Or"
« Antwort #9 am: März 26, 2018, 08:16:44 »
Ich stimme die voll und ganz zu. Trotz allem weiß ich nicht wie ich es lösen soll, bzw. den Defekt beheben.
Die Daten sollen eh in Excel exportiert werden, von daher lass ich jetzt Excel die arbeit machen, bevor ich mir
stundenlang den Kopf zerbreche - so ärgerlich das Ganze auch ist...
----------------------
Mit freundlichen Grüßen

Max
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 951
Re: SQL Abfrage mit mehreren "And" und "Or"
« Antwort #10 am: März 26, 2018, 13:22:19 »
Wenn die Abfragedefinition richtig ist (was ich auch behaupten würde), dann könnte es vielleicht sein, dass mit einer Tabelle gearbeitet wird und man aber eine andere Tabelle anschaut.
Man sollte also einmal die Gesamtkonstellation anschauen.
Mit freundlichem Glück Auf!

Eberhard
 

 

Datensatzzähler in einer Abfrage

Begonnen von peterBoard Tabelle/Abfrage

Antworten: 6
Aufrufe: 13915
Letzter Beitrag Juni 16, 2010, 16:32:34
von cyorps
Abfrage für Terminüberschneidungen und visuelle Darstellung

Begonnen von centaurusBoard Tabelle/Abfrage

Antworten: 3
Aufrufe: 6394
Letzter Beitrag Januar 21, 2011, 21:30:14
von cy_one_1
Datenerfassung mit Abfrage

Begonnen von Daniel-GSBoard Tabelle/Abfrage

Antworten: 2
Aufrufe: 5555
Letzter Beitrag Mai 05, 2010, 22:52:18
von oma
SQL Abfrage DELETE rückgängig machen??

Begonnen von hmfmartinBoard Tabelle/Abfrage

Antworten: 1
Aufrufe: 7352
Letzter Beitrag Mai 08, 2010, 19:18:08
von MzKlMu
6 Mio Datensätze bei Abfrage

Begonnen von JohannaBoard Tabelle/Abfrage

Antworten: 11
Aufrufe: 8903
Letzter Beitrag Mai 19, 2010, 12:29:47
von Wurliwurm