SQL Anweisung Kundengruppe

Brossi66

Aktives Mitglied
12. Juli 2017
52
0
Tolle Antwort. Die Adressen der Kunden aus der tAdresse soll es in die gleiche Tabelle importieren wie die Adressen der Ansprechpartner aus tAnsprechpartner, die Ansprechpartner werden aber nicht importiert
 

mh1

Sehr aktives Mitglied
4. Oktober 2020
1.767
535
Soweit ich sehe holt es aber die einzelnen Ansprechpartner nicht mit ab
Spiel das Ganze doch mal ganz klassisch mit Papier und Bleistift durch.

Was machst du denn mit deiner obigen Abfrage?
Du fragst bestimmte Zeilen aus tAdresse ab und was machst du dann mit dem JOIN?
Du kombinierst mit den gefundenen Zeilen bestimmte Spalten aus tAnsprechpartner, tKunde und tKundenGruppe. Aber was du wirklich machen willst ist doch:
zusätzlich zu den gefundenen Zeilen aus tadresse auch noch weitere Zeilen aus tansprechpartner raussuchen
Der JOIN kombiniert Spalten von zwei Tabellen und UNION kombiniert Zeilen von zwei Queries. Du musst im Endeffekt also zwei Abfragen machen und die mit Union zu einer großen Ergebnisliste verknüpfen. So in der Art SELECT *FROM tAdresse UNION SELECT * FROM tAnsprechpartner
 

Brossi66

Aktives Mitglied
12. Juli 2017
52
0
verstehe ich nicht, was soll ich mit Papier und Bleistift machen?

Ich benötige die Abfrage wie oben. Das funktioniert soweit für die Kunden gut. Aber ich benötige dazu auch die Daten aus der tAnsprechpartner in die gleiche Tabelle importiert. Also Ansprechpartner.Name etc.

Ist das klar ausgedrückt oder ist es noch unverständlich? Ich bin kein Profi im SQL ... leider.
 

mh1

Sehr aktives Mitglied
4. Oktober 2020
1.767
535
Du bildest oben in deiner Abfrage ein kartesisches Produkt.
Aber was du eigentlich machen willst, ist zwei Ergebnismengen verketten.
 

mh1

Sehr aktives Mitglied
4. Oktober 2020
1.767
535
wie gesagt, ich bin Laie in dieser Sache. Ich benötige also den Code dafür.
Hab ich dir oben in der Antwort geschrieben. Ich dachte, dir ist viel mehr geholfen, wenn ich dir nur sage, welche Werkzeuge du benutzen musst, anstatt dir den Tisch fix und fertig zusammen zuschrauben.
Sorry -bin da von mir ausgegangen (denn ich will immer dazulernen ;))

Also: du brauchst hier zwei Abfragen. Einmal die Abfrage aus tAdresse und einmal die Abfrage aus tAnsprechpartner. Die Ergebnisse dieser zwei Abfragen verkettest du dann mit UNION und hast dann im Ergebnis eine Liste mit Datensätzen aus tAdresse und zusätzlich die Datensätze aus tAnsprechpartner.
Also im Prinzip dasselbe wie wenn du erst Liste1 in deinen Mailer importierst und dann Liste2 ;)
 

mh1

Sehr aktives Mitglied
4. Oktober 2020
1.767
535
Danke für den Tipp, aber wie gesagt, ich bin Laie und suche jemand der mir den Code kurz schreibt
Ach so. Da hab ich dein Anliegen ursprünglich wohl falsch vestanden. SORRY :)

Prinzipiell sollte dir da jeder IT Dienstleister, der sich mit SQL auskennt weiterhelfen können.
Von Vorteil wäre aber jemand, der sich mit JTL auskennt und weiß wie & wo welche Daten in der Datenbank liegen, bzw. wann & warum sich was ändert. Solche JTL-Servicepartner sind auch hier im Forum unterwegs.

Ein andere Ansatz wäre evtl noch ganz vom SQL weg zu gehen und gar nicht versuchen, unmittelbar auf die Datenbank zuzugreifen. Mit der Ameise lassen sich ja auch sehr viele Daten exportiern und Bedingungen, Filter, Sortierungen u.ä. kann man dann als Exportvorlage abspeichern und immer wieder auch automatisiert ausführen.
 

Brossi66

Aktives Mitglied
12. Juli 2017
52
0
Danke …. Ameise wurde hier schon benannt , ich suche aber die direkte Anbindung und hatte gehofft eben hier im JTL Forum
 

Brossi66

Aktives Mitglied
12. Juli 2017
52
0
Ich habe jetzt mal so agiert:

SELECT distinct(tAdresse.cMail), tAdresse.cName,tAdresse.cVorname,tAdresse.cFirma, tKundenGruppe.cName
FROM tAdresse
left join tKunde on tkunde.kKunde=tAdresse.kKunde
left join tKundenGruppe on tkunde.kKundenGruppe=tKundenGruppe.kKundenGruppe where tAdresse.cMail is not null and tkundengruppe.cname <> 'Amazon' and tAdresse.cMail <> ''

union

SELECT distinct(tAnsprechpartner.cMail), tAnsprechpartner.cName,tAnsprechpartner.cVorname,tAnsprechpartner.cAnrede, tAnsprechpartner.cTel
FROM tAnsprechpartner
where tAnsprechpartner.cMail is not null and tAnsprechpartner.cMail <> ''

Ich musste hier natürlich privisorisch die tel Nr. aus den Ansprechpartnern mit übernehmen, da bei Union die Anzahl der Felder gleich sein muss. Die tel. Nr. wird jetzt natürlich in der Spalte Kundengruppe mit eingereicht., Wie kann ich das ändern so das hier auch die Kundengruppe für die Ansprechpartner mit abgerufen und in die Kundengruppe eingetragen wird?
 

mh1

Sehr aktives Mitglied
4. Oktober 2020
1.767
535
Ich hab gerade keinen Zugriff auf einen SQL-Server, deshalb kann ich nichts testen. Daher hier nur Stichworte als Anmerkung:
  • In dem ersten SELECT auf tAdresse bekommst du doch die Kundengruppe nur deshalb, weil du den JOIN gemacht hast. Also müsstest du doch beim zweiten SELECT auch einen JOIN machen...
  • Mache aber nicht zwei SELECT mit jeweils demselben JOIN, um die dann mit Union zu verbinden, sondern mach besser zuerst den UNION und erst dann (und nur einmal) den JOIN. Benutze dazu eine abgeleitete Tabelle (beliebiger Name, hier z.B. "foo")
  • Ich würde UNION ALL anstatt UNION benutzen, um zu vermeiden das die Ergebnismengen sortiert werden. Allerdings weiß ich auch nicht genau wie deine Daten aussehen
  • Ich weiß auch nicht genau, warum du den DISTINCT Befehl verwendest. Distinct sollte man wenn es geht vermeiden. Prüfe, ob du dasselbe nicht durch ein GROUP BY erreichen kannst. Oft lässt sich eine Abfrage durch die Vermeidung von DISTINCT um ein vielfaches beschleunigen.
  • wie auch immer deine Abfrage nachher aussieht: schau dir auf jeden Fall den Ausführungsplan an. Vielleicht fällt dir dann was auf, wie/wo du die Abfrage noch optimieren kannst.
  • Und bevor du beginnst, alles selber zu machen, schau mal nach ob die 1.7 nicht vielleicht schon einen VIEW mitbringt, der genau das macht, was du willst.
Vom Prinzip her würde ich die Abfrage so in der Art schreiben (Ausformulieren bzw. Optimieren musst du aber selber, da ich keine 1.7 habe und nicht testen kann):

Code:
SELECT *
FROM  ( SELECT .... FROM tAdresse UNION ALL SELECT ... FROM tAnsprechpartner ) foo
JOIN tKundengruppe kg ON foo.kKunde = kg.kKunde
 
  • Gefällt mir
Reaktionen: absolutbad

mh1

Sehr aktives Mitglied
4. Oktober 2020
1.767
535
Ich habe mir das jetzt mal spaßeshalber in meiner 1.5 angekuckt.
Vorausgesetzt die Datenstruktur ist in deiner 1.7 gleich, dann kommst du so an die Emailadressen:
SQL:
SELECT foo.kKunde, foo.cName, foo.cMail, kg.cName
FROM
 (
  SELECT kKunde, cName, cMail FROM  tAdresse WHERE NULLIF(cMail, '') IS NOT NULL
  UNION ALL
  SELECT kKunde, cName, cMail FROM tAnsprechpartner WHERE NULLIF(cMail, '') IS NOT NULL
 ) foo
LEFT JOIN tKunde k ON foo.kKunde = k.kKunde
LEFT JOIN tKundengruppe kg ON k.kKundenGruppe = kg.kKundenGruppe

Wenn ich es noch richtig in Erinnerung habe, willst du diese Daten in ein Emailprogramm einspielen bzw, das Emailprogramm dauerhaft anbinden.
Dazu solltest du aber vorher klären, wie dieses Emailprogramm mit Duplikaten umgeht.

Und was passiert, wenn sich ein Kunde vom Newsletter abmeldet? Wird dann die Emailadresse im Mailprogramm gelöscht? Wie stellst du dann sicht, dass diese Emailadresse nicht wieder über das SQL ins Emailprogramm kommt?
 

Brossi66

Aktives Mitglied
12. Juli 2017
52
0
Ich habe mir das jetzt mal spaßeshalber in meiner 1.5 angekuckt.
Vorausgesetzt die Datenstruktur ist in deiner 1.7 gleich, dann kommst du so an die Emailadressen:
SQL:
SELECT foo.kKunde, foo.cName, foo.cMail, kg.cName
FROM
 (
  SELECT kKunde, cName, cMail FROM  tAdresse WHERE NULLIF(cMail, '') IS NOT NULL
  UNION ALL
  SELECT kKunde, cName, cMail FROM tAnsprechpartner WHERE NULLIF(cMail, '') IS NOT NULL
 ) foo
LEFT JOIN tKunde k ON foo.kKunde = k.kKunde
LEFT JOIN tKundengruppe kg ON k.kKundenGruppe = kg.kKundenGruppe

Wenn ich es noch richtig in Erinnerung habe, willst du diese Daten in ein Emailprogramm einspielen bzw, das Emailprogramm dauerhaft anbinden.
Dazu solltest du aber vorher klären, wie dieses Emailprogramm mit Duplikaten umgeht.

Und was passiert, wenn sich ein Kunde vom Newsletter abmeldet? Wird dann die Emailadresse im Mailprogramm gelöscht? Wie stellst du dann sicht, dass diese Emailadresse nicht wieder über das SQL ins Emailprogramm kommt?
Das klingt schon mal sehr gut. Ich habe es jetzt wie folgt ergänzt:


SELECT foo.kKunde, foo.cAnrede, foo.cVorname, foo.cName, foo.cMail, kg.cName
FROM
(
SELECT kKunde, cAnrede, cVorname, cName, cMail FROM tAdresse WHERE NULLIF(cMail, '') IS NOT NULL
UNION ALL
SELECT kKunde, cAnrede, cVorname, cName, cMail FROM tAnsprechpartner WHERE NULLIF(cMail, '') IS NOT NULL
) foo
LEFT JOIN tKunde k ON foo.kKunde = k.kKunde
LEFT JOIN tKundengruppe kg ON k.kKundenGruppe = kg.kKundenGruppe

Jetzt benötige ich noch den Firmennamen aus den Adressen mit. Kann ich aber so nicht da gleich viele Argumente benötigt werden und es in tAnsprechpartner ja das Feld cFirma nicht gibt. Was kann ich tun?
 

Ähnliche Themen