Frage zu Subquerys und ANY (seeehr kompliziert)

mikexmagic

Grünschnabel
Hallo zusammen...

Ich habe eine Query erstellt mit einer Bedingung die sich über drei Spalten mit einer UND-Verknüpfung erstreckt:
SQL:
Where
  (consultants.grp_id = '1' And
  qpartys.pweek >= '2014|05' And
  qpartys.pweek <= '2014|30' And
  qpartys.pstatus = 3)
Kein Problem!

jetzt soll die WHERE Klausel aber um ein oder mehrere ODER Einträge eränzt werden, etwa so:

SQL:
Where
  (consultants.grp_id = '1' And
  qpartys.pweek >= '2014|05' And
  qpartys.pweek <= '2014|30' And
  qpartys.pstatus = 3)
OR
  (consultants.grp_id = '68' And
  qpartys.pweek >= '2014|05' And
  qpartys.pweek <= '2014|14' And
  qpartys.pstatus = 3)
OR
  (consultants.grp_id = '26' And
  qpartys.pweek >= '2014|05' And
  qpartys.pweek <= '2014|16' And
  qpartys.pstatus = 3)

Die OR Bereiche bekommen aber Ihrerseits die Kriterien durch eine Subquery. Diese wiederrum kann eine oder mehrere Ergebnisse beinhalten. Also mein aktueller Entwurf sieht so aus:

SQL:
Where
  (consultants.grp_id = 1 And
  qpartys.pweek >= '2014|05' And
  qpartys.pweek <= '2014|30' And
  qpartys.pstatus = 3)
OR
  (consultants.grp_id = 
	Any(Select
		consultants.grp_id As promogrp
		  From
			consultants
		  Where
			consultants.promoweek >= '2014|05' And
			consultants.promoweek < '2014|30' And
			qpartys.pstatus = 3 And
			consultants.promocon = 1) And
  qpartys.pweek >= '2014|05' And
  qpartys.pweek < 
	Any(Select
		consultants.promoweek
		  From
			consultants
		  Where
			consultants.promoweek >= '2014|05' And
			consultants.promoweek < '2014|30' And
			qpartys.pstatus = 3 And
			consultants.promocon = 1))

Innerhalb der OR-Klausel werden in zwei Kriterien jeweils SUBQUERYS aufgerufen. Beide SUBQUERYS liefern jeweils zwei Ergebnisse.

Jetzt die finale Frage:
Werden durch die AND-Verknüpfung innerhalb der OR-Klausel jeweils nur die beisen ersten Zeilen und die beiden zweiten Zeilen der SUBQUERY-Ergebnisse miteinander verglichen oder alle Zeilen mit allen Zeilen?

:confused::confused::confused:

Wer hats verstanden und wer kanns beantworten?
 
Zuletzt bearbeitet von einem Moderator:
item: MySQL? Oracle?

item: qpartys.pstatus = 3 an oberste Stelle setzen, denn das ist bei allen gleich

item: Was soll 'qpartys.pstatus = 3' innerhalb des Subqueries bewirken

item: Anhand des WHERE kann ich dir nicht helfen. Besser du beschreibst mal mit einem Beispiel was du hast und das du brauchst. Wahrscheinlich gehts mit JOIN eleganter
 
Nachtrag:
Irgend sowas könnte ich mir vorstellen.
Wobei es noch schöner wäre, die Fallunterscheidung in eine Tabelle auszulagern
SQL:
SELECT
    q.*
FROM
    (
        SELECT
            c.grp_id,
            MIN(c.promoweek) AS min_pweek,
            MAX(c.promoweek) AS max_pweek
        FROM
            consultants c
        WHERE
            c.grp_id IN(1,68,26)
            AND c.promocon = 1
            -- BETWEEN mit Fallunterscheidiung
            AND c.promoweek BETWEEN 
                    CASE cgrp_id 
                    WHEN 1  THEN '2014|05'
                    WHEN 68 THEN '2014|05'
                    WHEN 26 THEN '2014|05'
                    END
                 AND
                    CASE cgrp_id 
                    WHEN 1  THEN '2014|05'
                    WHEN 68 THEN '2014|14'
                    WHEN 26 THEN '2014|16'
                    END
        GROUP BY
            c.grp_id
    ) c1,
    qpartys q
WHERE
    q.pstatus = 3
    AND c1.grp_id = 1
    AND q.pweek BETWEEN c1.min_pweek AND c1.max_pweek
 
item: MySQL? Oracle?
MySQL

item: qpartys.pstatus = 3 an oberste Stelle setzen, denn das ist bei allen gleich
Klar... leuchtet ein!

item: Was soll 'qpartys.pstatus = 3' innerhalb des Subqueries bewirken
Äh... dass nur diese Datensätze gefunden werden?! Muss ich mitfiltern sonst liefern die Subqueries mehr Zeilen.

item: Anhand des WHERE kann ich dir nicht helfen. Besser du beschreibst mal mit einem Beispiel was du hast und das du brauchst. Wahrscheinlich gehts mit JOIN eleganter

Ja, also... In der Tabelle qpartys stehen Umsatzzahlen von unterschiedlichen Verkäufern. Die Verkäufer stehen in der Tabelle consultants... und sind in Gruppen (grp_id) aufgeteilt.
Die Umsätze der Verkäufer sollen anhand der Gruppe und des Zeitraum (KW) summiert werden. Jetzt kann es aber sein, dass ein VK innerhald des Zeitraum die Gruppe gewechselt hat (promoweek). Also brauche ich die ODER Verknüfung um die Zahlen zu ermitteln bis zum Wechselzeitpunkt. Und das kann halt mehrere VK betreffen... Daher ANY...
 
Wenn sie nicht fix sind, dann darfst du sie NICHT fix im SQL setzen!

Warum ein ODER? Hast du keine histosierte Tabelle, von wann bis wann der VK in in welcher Gruppe wahr?
 
Die komplette SQL-Klausel wird natürlich live per PHP generiert. Heißt: Der Wochenzeitraum kommt dann aus einer Variable. Fand innerhalb des Zeitraums ein wechsel statt, werden die Umsätze von Zeitraumbeginn bis Wechselzeitpunkt (eine der Subs) ebenfalls mit aufgenommen
 
Schön.
Ich würde die gesuchten Dingens trotzem in eine Tabelle schreiben. Erleichtert das Leben ungemein.

Zum weiteren Aufbau:Leider darfst du von mir im Moment keine weitere Hilfe erwarten (Ein SQL-Ansatz habe ich ja gepostet), denn ich habe immer noch nicht verstanden was da genau geschehen soll.
 
Zurück