Announcement

Collapse
No announcement yet.

OR Klausel bei Group By

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • OR Klausel bei Group By

    Hallo zusammen,

    ich habe folgendes Statement:

    select i.name, sum(i.qty_ordered) as Anzahl, sum(i.qty_ordered * i.price) as Nettoumsatz

    from sales_flat_order_item i
    join sales_flat_order o on i.order_id = o.entity_id

    where (o.created_at between '2014-11-03' and '2015-03-08')

    and o.status not like '%holded%'
    and o.status not like 'canceled'
    and o.status not like '%closed%'
    and (o.store_id like '50' or o.store_id like '61')

    group by i.name
    order by o.store_id DESC


    Das statement soll mir für die Stores 50 und 60 jeweils alles skunamen gruppieren und die dazugehörige Summe über Anzahl und Umsatz geben. Das Problem ist jetzt, dass anscheinend die OR-Bedingung mit der Group By Funktion kollidiert. Für die Stores 50 und 60 werden nicht alle Zeilen aufsummiert. Wenn ich jeweils für Store 50 und 60 ein separates Statement mache ohne die OR-Bedingung kommen in Summe mehr Zeilen heraus, als wenn ich beide Stores zusammen wie in der obigen Abfrage abfrage. Das Zeilen fehlen passiert nur wenn ich die Group By Funktion. Ohne Group By gibt es keinen unterschied zwischen der Abfrage wie sie oben steht und zwei Abfragen jeweils für Store 50 und 60.

    Weiß jemand woran das liegen könnte?

    Vielen Dank schonmalOR Klausel bei Group By

  • #2
    Ist denn i.name irgendwie in Bezug zur ID 50 oder 60?
    Wenn nicht, wird halt über alle eindeutigen i.name gruppiert und die Summen enthalten Werte für beide Stores.
    Wenn Du die StoreID oder Storename mit reinnimmst und gruppierst, sollte das deutlich werden.

    Als Gegenprobe kannst Du auch die Summe der Summen bilden, die müsste in beiden Fällen (2 separate Statements und Or-Bedingung) identisch sein.
    Gruß, defo

    Comment


    • #3
      Hallo,
      durch das einfache OR werden natürlich auch i.name zusammengefasst, die sowohl o.store_id like '50' als auch o.store_id like '61' haben. Das wirkt sich natürlich auf die reine Anzahl der Zeilen aus. Diese Schnittmenge hast du bei den Einzelabfragen separat und damit mehr.

      Anmerkung:
      Die Prüfung mit LIKE ohne Angabe eines Platzhalters wie '%' oder '?' ist sinnlos. Hier ist ein konkreter Vergleich mit '=' einfacher und schneller. Der String-Vergleich von Zahlen enthält Tücken, die vor allem bei Größer-/Kleiner-Vergleichen zum Tragen kommen. Zahlen mit Zahlen vergleichen ist sicherer und schneller als Stringoperationen!

      Klugscheißen:
      OR ist keine Klausel (wie z.B. WHERE oder GROUP BY), sondern ein Operator

      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Besten Dank für die hilfreichen Antworten. Ich habe nun = benutzt und den storenamen mit ins group by genommen. Funktioniert

        Comment

        Working...
        X