AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Top bei Union Abfrage
Thema durchsuchen
Ansicht
Themen-Optionen

Top bei Union Abfrage

Ein Thema von PASST · begonnen am 2. Apr 2009 · letzter Beitrag vom 3. Apr 2009
Antwort Antwort
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#1

Top bei Union Abfrage

  Alt 2. Apr 2009, 17:28
Datenbank: ADS • Version: 9.1 • Zugriff über: TADS
Hallo allerseits,

ich benötige Hilfestellung zu einer Abfrage mit TOP im Zusammenhang mit UNION.
Zum Bsp suche ich zu jedem Land jeweils die Top 10 Kunden.
SQL-Code:
select top 10 land, kunde, sum(umsatz)
from auswertung
where land = 'Deutschland'
group by kunde
order by sum(umsatz) DESC
Durch "umsatz DESC" erreiche ich, dass die umsatzstärksten Kunden angezeigt werden.
Versuche ich jetzt die Top10-Kunden verschiedener Länder zusammenzufügen, klappt das nicht
SQL-Code:
select top 10 land, kunde, sum(umsatz)
from auswertung
where land = 'Deutschland'
group by kunde

union

select top 10 land, kunde, sum(umsatz)
from auswertung
where land = 'Niederlande'
group by kunde

union

select top 10 land, kunde, sum(umsatz)
from auswertung
where land = 'Belgien'
group by kunde

order by land, umsatz DESC
In diesem Fall werden nicht die umsatzstärksten sondern die umsatzschwächsten Kunden des jeweiligen Landes angezeigt. Der Kompiler akzeptiert auch nicht, dass "order by" nicht hinter jede Einzelabfrage gestellt wird.

Hat jemand eine Idee wie ich diese Abfrage erfolgreich zusammenbasteln kann?

Gruß
Peter
  Mit Zitat antworten Zitat
Zwoetzen

Registriert seit: 19. Sep 2007
Ort: Ilmenau
93 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Top bei Union Abfrage

  Alt 2. Apr 2009, 18:02
SQL-Code:
SELECT TOP 10 *
FROM (

select land, kunde, sum(umsatz)
from auswertung
where land = 'Deutschland'
group by kunde

union

select land, kunde, sum(umsatz)
from auswertung
where land = 'Niederlande'
group by kunde

union

select land, kunde, sum(umsatz)
from auswertung
where land = 'Belgien'
group by kunde

)
ORDER BY land, umsatz DESC
Sollte so eigentlich passen

EDIT: Oder die Top10 jedes Landes, sodass am Ende hier 30 Datensätze rauskommen sollen? Dann nur das ORDER BY in eine Überabfrage, und die SELECT TOP 10 in den UNIONs beibehalten.
Bin grad ein wenig verwirrt ^^
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Top bei Union Abfrage

  Alt 2. Apr 2009, 18:06
Mit "Order By" wird die komplette Abfrage (alle Union Select) sortiert.
Man kann im "Order By" die Spalte angeben, nach der sortiert werden soll.

Order by 1 asc, 2 desc;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Top bei Union Abfrage

  Alt 2. Apr 2009, 18:06
Unterstützt ADS Derived Tables?
Select Top 5 from (<Union-Abfrage>);
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#5

Re: Top bei Union Abfrage

  Alt 2. Apr 2009, 20:41
Zitat von mkinzler:
Unterstützt ADS Derived Tables?
Select Top 5 from (<Union-Abfrage>);
Ist im Prinzip ja die Lösung von Zwoetzen ... nur eine Änderung: Die Tabelle muss mit einem Alias spezifiziert werden.

Select Top 5 a.* from (<Union-Abfrage>) a;
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Top bei Union Abfrage

  Alt 3. Apr 2009, 09:18
Leider führt keiner der Vorschläge zum Ergebnis, was ich suche.

Ich komme wahrscheinlich nicht herum jeweils einzelne Abfrage auszuführen, die Resultate in eine temporäre Tabelle zu speichern und diese dann wieder abzufragen.

Das Arbeiten mit temporären Tabellen scheint bei komplexen Abfragen unter SQL-Servern üblich zu sein oder hat jemand eine andere Idee?

Gruß
PEter
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#7

Re: Top bei Union Abfrage

  Alt 3. Apr 2009, 10:43
eine Abfrage mit vorgegebenen Ländern:
SQL-Code:
select * from
(
  select top 5 * from #test where land='DEorder by umsatz desc
) a
union select * from
(
  select top 5 * from #test where land='NLorder by umsatz desc
) b
union select * from
(
  select top 5 * from #test where land='UKorder by umsatz desc
) c
union select * from
(
  select top 5 * from #test where land='FRorder by umsatz desc
) d
union select * from
(
  select top 5 * from #test where land='ITorder by umsatz desc
) e

order by land
eine Lösung über ein Script mit temp Tabelle kommt gleich
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#8

Re: Top bei Union Abfrage

  Alt 3. Apr 2009, 10:51
So, hier nun eine Script-Lösung, die absolut flexibel ist. Es ist im Prinzip egal, wieviele Felder in der Quelltabelle (hier #test) stehen. Die letzte Abfrage erstellt dann aus der ID-Liste (#result) das, was Du schliesslich benötigst.
Übrigens: Du musst das nicht als Stored Procedure anlegen. Einfach komplett in eine TAdsQuery verpacken und gut.

SQL-Code:
declare c cursor as select distinct(land) from #test;

try
  drop table #result;
catch all
end try;

create table #result(id integer);

open c;
while fetch c do
  insert into #result select top 5 id from #test where land=c.land order by umsatz desc;
end while;
close c;

select a.* from #test a
  inner join #result b on a.id=b.id
order by land, umsatz desc
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

Re: Top bei Union Abfrage

  Alt 3. Apr 2009, 10:54
Hallo,

guck mal bitte, ob dat jeht:

SQL-Code:
select top 10 * from (
  select top 10 land, kunde, sum(umsatz) As Umsatz from auswertung where land = 'Deutschlandgroup by kunde order by 3
) de
union all
select * from (
  select top 10 land, kunde, sum(umsatz) As Umsatz from auswertung where land = 'Niederlandegroup by kunde order by 3
) ne
union all
select * from (
  select top 10 land, kunde, sum(umsatz) As Umsatz from auswertung where land = 'Belgiengroup by kunde order by 3
) be
order by land, umsatz DESC
Habe gerade was analoges mit anderen Daten probiert, das Ergebnis sah plausibel aus.
  Mit Zitat antworten Zitat
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Top bei Union Abfrage

  Alt 3. Apr 2009, 14:36
Danke, die letzten Vorschläge von nahpets und joachimd haben funktioniert. Das Skript habe ich jetzt nicht ausgeführt.
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:51 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