Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln (https://www.delphipraxis.net/213838-nur-die-telefonnummer-vom-ersten-ansprechpartner-eines-kunden-ermitteln.html)

BlueStarHH 4. Okt 2023 11:39

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

Billa 4. Okt 2023 12:20

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

BlueStarHH 4. Okt 2023 12:22

AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
 
Zitat:

Zitat von Billa (Beitrag 1527683)
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

Ich möchte das ganze nicht nur für einen Kunden haben. Sondern für *alle* Kunden. Deine Abfrage wird nur einen Datensatz für einen Kunden geben.

rapante 4. Okt 2023 12:24

AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
 
Moin,
ein einfacher SELECT mit GROUP BY sollte schon reichen:

Code:
  SELECT KdNr, TelefonNr, FaxNr
  FROM Ansprechpartner
  WHERE Aktiv
  GROUP BY KdNr
  ORDER BY standard DESC, ID DESC
bzw, wenn alle kunden auch ohne Ansprechpartner gelistet werden sollen:

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

BlueStarHH 4. Okt 2023 12:28

AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
 
Zitat:

Zitat von rapante (Beitrag 1527685)
Moin,
ein einfacher SELECT mit GROUP BY sollte schon reichen:

Code:
  SELECT KdNr, TelefonNr, FaxNr
  FROM Ansprechpartner
  WHERE Aktiv
  GROUP BY KdNr
  ORDER BY standard DESC, ID DESC

Gibt diese Meldung:

Zitat:

Invalid expression in the ORDER BY clause (not contained in either an aggregate function or the GROUP BY clause).

rapante 4. Okt 2023 12:37

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;

Jumpy 4. Okt 2023 13:22

AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
 
SQL-Code:
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
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

itsChris 4. Okt 2023 13:35

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;

BlueStarHH 4. Okt 2023 13:59

AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
 
Zitat:

Zitat von Jumpy (Beitrag 1527691)
SQL-Code:
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
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

Danke, das läuft. Aber es gibt mir ca. 300 Datensätzen weniger als in der Ansprechpartner-Tabelle sind (select count(*) from Ansprechpartner)
Warum könnten bei Deinem Code Datensätze fehlen?

BlueStarHH 4. Okt 2023 14:04

AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
 
Zitat:

Zitat von rapante (Beitrag 1527687)
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;

Super, das läuft und alle Datensätze sind da.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:46 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz