![]() |
Datenbank: Firebird • Version: 3.x • Zugriff über: IBDAC
Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
Hallo,
ich habe eine Tabelle mit Ansprechpartnern. Dabei kann es je Kundennummer beliebig viele Ansprechpartner geben. Ich möchte nun eine Liste mit allen Kundennummern und je Kundennummer genau eine Telefonnumer und Faxnummer. Und zwar die Telefonnumer vom Standard-Ansprechpartner (Bool Feld Standard = true) oder wenn es keinen Standard-Ansprechpartner gibt, den Ansprechpartner der zuletzt angelegt wurde (kleinste ID). Ich habe das probiert, aber läuft ewig und es kommen zwar alle Ansprechpartner zurück aber insgesamt hat nur einer eine Telefonnummer in der Rückgabe:
SQL-Code:
select ap.KdNr, sub.TelefonNr, sub.FaxNr
from Ansprechpartner ap left join ( select first 1 TelefonNr, FaxNr, KdNr from Ansprechpartner order by standard desc, ID desc ) sub on sub.KdNr = ap.KdNr where Aktiv |
AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
select "first 1" ... hilft Dir weiter, etwa so:
... select first 1 ap.KdNr, sub.TelefonNr, sub.FaxNr from Ansprechpartner ap left join sub on ub.KdNr = ap.KdNr order by sub.standard desc, sub.ID desc where ap.KdNr = :KDNR ... VG |
AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
Zitat:
|
AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
Moin,
ein einfacher SELECT mit GROUP BY sollte schon reichen:
Code:
bzw, wenn alle kunden auch ohne Ansprechpartner gelistet werden sollen:
SELECT KdNr, TelefonNr, FaxNr
FROM Ansprechpartner WHERE Aktiv GROUP BY KdNr ORDER BY standard DESC, ID DESC
Code:
SELECT kunden.KdNr, ap.TelefonNr, ap.FaxNr
FROM kunden LEFT JOIN (SELECT KdNr, TelefonNr, FaxNr FROM Ansprechpartner WHERE Aktiv GROUP BY KdNr ORDER BY standard DESC, ID DESC) ap ON kunden.KdNr = Ansprechpartner.KdNr |
AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
Zitat:
Zitat:
|
AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
Ach Sorry - ich hatte vergessen, dass das bei Firebird so nicht funktioniert mit dem GROUP BY:
In Firebird müsste das über row_number() gehen (Ich kann es leider gerade nicht testen):
Code:
WITH ap AS (
SELECT Ansprechpartner.KdNr, Ansprechpartner.TelefonNr, Ansprechpartner.FaxNr, ROW_NUMBER() OVER(PARTITION BY Ansprechpartner.KdNr ORDER BY standard DESC, id DESC) AS rk FROM Ansprechpartner) SELECT ap.* FROM ap WHERE ap.rk = 1; |
AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
SQL-Code:
Ich würde pro Kunde erstmal den Ansprechpartner ermitteln, der die Kriterien erfüllt (und da gibt es hier 2 disjunkte Wege), und dann von dem die Daten holen
WITH BASIS AS (
-- Kunden mit Standard-Ansprechpartner Select KdNr, max(id) as id from Ansprechpartner Where Standard=true Group By KdNr UNION -- Kunden ohne Standard-Ansperchpartner Select KdNr, max(id) as id from Ansprechpartner Where KdNr not in (Select Distinct KdNr From Ansprechpartner Where Standard=true) Group By KdNr ) Select A.KdNr, A.TelefonNr, A.FaxNr From Basis B Left Join Ansprechpartner A ON A.KdNr=B.KdNr AND A.ID=Bi.ID |
AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
Die vorherigen Antworten sollten beide funktionieren. Ich hätte noch eine dritte im Angebot:
Code:
SELECT
outerAP.KdNr, ( SELECT FIRST 1 TelefonNr FROM Ansprechpartner AS innerAP WHERE innerAP.KdNr = outerAP.KdNr ORDER BY ( CASE WHEN innerAP.Standard THEN 1 ELSE 2 END ), innerAP.ID DESC ) AS TelefonNr, ( SELECT FIRST 1 FaxNr FROM Ansprechpartner AS innerAP WHERE innerAP.KdNr = outerAP.KdNr ORDER BY ( CASE WHEN innerAP.Standard THEN 1 ELSE 2 END ), innerAP.ID DESC ) AS FaxNr FROM Ansprechpartner AS outerAP GROUP BY outerAP.KdNr; |
AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
Zitat:
Warum könnten bei Deinem Code Datensätze fehlen? |
AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
Zitat:
|
AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
Zitat:
|
AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
Zitat:
|
AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
Zitat:
|
AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
Ich brauche auch noch eine zweite Abfrage aufbauend auf der hier gefragten: Die Ansprechpartnerdaten (Tel, Fax) sollen mit allen Feldern der Kundentabelle in einer Abfrage zurückgegeben werden. Ich habe es mit den Lösungen von Jumpy und rapante probiert. Beide Abfragen habe ich nach 5 Minuten Laufzeit abgebrochen. Warum ist das so langsam? Wie gehts besser? Für sich laufen die Ansprechpartner-Abfragen schnell, aber sobald die mit den Kunden verbunden werden, extram langsam.
Der Code von Jumpy mit Kunden:
SQL-Code:
oder der Code von Rapante mit Kunden
WITH BASIS AS (
-- Kunden mit Standard-Ansprechpartner Select KdNr, max(id) as id from Ansprechpartner Where Standard=true Group By KdNr UNION -- Kunden ohne Standard-Ansperchpartner Select KdNr, max(id) as id from Ansprechpartner Where KdNr not in (Select Distinct KdNr From Ansprechpartner Where Standard=true) Group By KdNr ) select * from Kunde k left join ( Select A.KdNr, A.TelefonNr, A.FaxNr From Basis B Left Join Ansprechpartner A ON A.KdNr=B.KdNr AND A.ID=B.ID ) sub on sub.KdNr = k.KdNr where k.aktiv
SQL-Code:
WITH ap AS (
SELECT Ansprechpartner.KdNr, Ansprechpartner.TelefonNr, Ansprechpartner.FaxNr, ROW_NUMBER() OVER(PARTITION BY Ansprechpartner.KdNr ORDER BY standard DESC, id DESC) AS rk FROM Ansprechpartner) select * from Kunde k left join ( SELECT ap.* FROM ap WHERE ap.rk = 1 ) sub on sub.KdNr = k.KdNr where k.aktiv |
AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
Wie sehen denn die Tabellendefinitionen aus?
Ist KdNr als Foreign Key definiert, bzw. gibt es Indexe? Wieviele Datensätze sind in den Tabellen vorhanden? |
AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
Wie sieht's so aus?
SQL-Code:
Select K.*, A.TelefonNr, A.FaxNr
from Kunde k Left join Basis B on B.KdNr=K.KdNr Left Join Ansprechpartner A ON A.KdNr=B.KdNr AND A.ID=B.ID |
AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
Zitat:
SQL-Code:
Jeweils über 10.000 Datensätze
create table ansprechpartner (
id integer not null, kdnr varchar(15) character set ascii not null, name varchar(50), telefonnr varchar(20), faxnr varchar(20), ... ); alter table ansprechpartner add constraint pk_ansprechpartner primary key (id); alter table ansprechpartner add constraint fk_ansprechpartner_1 foreign key (kdnr) references kunde (kdnr) on delete cascade on update cascade; create table kunde ( kdnr varchar(15) character set ascii not null, .. ); alter table kunde add constraint pk_kunde primary key (kdnr); |
AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
Zitat:
Alt: Left Join Ansprechpartner A ON A.KdNr=B.KdNr AND A.ID=B.ID Neu: Left Join Ansprechpartner A ON A.ID=B.ID Die (Ansprechpartner-)ID ist ja schon eindeutig einer KdNr zugeordnet?! |
AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz