AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln

Ein Thema von BlueStarHH · begonnen am 4. Okt 2023 · letzter Beitrag vom 5. Okt 2023
Antwort Antwort
Seite 1 von 2  1 2      
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#1

Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln

  Alt 4. Okt 2023, 12:39
Datenbank: Firebird • Version: 3.x • Zugriff über: IBDAC
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

Geändert von BlueStarHH ( 4. Okt 2023 um 13:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Billa
Billa

Registriert seit: 11. Aug 2003
237 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln

  Alt 4. Okt 2023, 13:20
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
Gruß Billa

Nur weil ich paranoid bin, heißt das nicht, daß die da draussen nicht hinter mir her sind....
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln

  Alt 4. Okt 2023, 13:22
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.
  Mit Zitat antworten Zitat
Benutzerbild von rapante
rapante

Registriert seit: 3. Jun 2009
Ort: OPR
172 Beiträge
 
Delphi 12 Athens
 
#4

AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln

  Alt 4. Okt 2023, 13:24
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
Micha

Geändert von rapante ( 4. Okt 2023 um 13:30 Uhr)
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln

  Alt 4. Okt 2023, 13:28
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).
  Mit Zitat antworten Zitat
Benutzerbild von rapante
rapante

Registriert seit: 3. Jun 2009
Ort: OPR
172 Beiträge
 
Delphi 12 Athens
 
#6

AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln

  Alt 4. Okt 2023, 13:37
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;
Micha

Geändert von rapante ( 4. Okt 2023 um 13:53 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#7

AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln

  Alt 4. Okt 2023, 14:22
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
Ralph
  Mit Zitat antworten Zitat
itsChris

Registriert seit: 29. Jul 2022
21 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln

  Alt 4. Okt 2023, 14:35
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;

Geändert von itsChris ( 4. Okt 2023 um 14:48 Uhr)
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln

  Alt 4. Okt 2023, 14:59
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?
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Nur die Telefonnummer vom ersten Ansprechpartner eines Kunden ermitteln

  Alt 4. Okt 2023, 15:04
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:45 Uhr.
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