![]() |
Re: Ersatz für DISTINCT ??
Hallo Hansa,
versuch mal folgendes:
SQL-Code:
Du solltest aus Geschwindigkeitsgründen in der Tabelle MWST Indexe auf
CREATE PROCEDURE ERMITTLE_ALLEMWSTSP (ABDATUM DATE)
RETURNS ( ID_OUT INTEGER, MWSTSATZ_OUT INTEGER, ABDATUM_OUT DATE, MWSTWERT_OUT DECIMAL(15,2)) AS begin FOR SELECT MWSTSATZ FROM MWST WHERE ABDATUM <= :ABDATUM GROUP BY MWSTSATZ /* GROUP BY statt SELECT DISTINCT verwendet, da GROUP BY indiziert arbeitet, DISTINCT nicht */ INTO :MWSTSATZ_OUT DO /* fuer jeden bis :ABDATUM vorhandenen MWSTSATZ */ BEGIN /* juengstes Aenderungsdatum ermitteln */ SELECT max (ABDATUM) FROM MWST WHERE MWSTSATZ = :MWSTSATZ_OUT AND ABDATUM <= :ABDATUM INTO :ABDATUM_OUT; /* jetzt noch ID und Wert ermitteln */ SELECT ID, MWSTWERT FROM MWST WHERE MWSTSATZ = :MWSTSATZ_OUT AND ABDATUM = :ABDATUM_OUT INTO :ID_OUT, :MWSTWERT_OUT; SUSPEND; END end
Des weiteren bin ich davon ausgegangen, dass es einen Unique über MWSTSATZ und ABDATUM gibt. Ansonsten könnte die letzte select in der Procedure ein multiple rows in a singelton select hervorrufen. Das Ganze ist runtergetippt und nicht getestet, da ich gerade keinen DB-Server am Laufen habe. Bei Fehlfunktion bitte nachfragen. Hope it helps onlinekater |
Re: Ersatz für DISTINCT ??
Warum so eine kleinigkeit auf den SQL Server auslagern?
Wie wäre es mit?
Delphi-Quellcode:
Frank :coder:
function GetMwStWert(D:Datumstyp):real; // Noch aus früheren Zeiten... Da gabe es noch keine Datetime!
var DDD : Datumstyp; begin if D.Jahr > 92 then begin ValDate('01.04.98',DDD); if AbsDatum(D) >= AbsDatum(DDD) then result := 16.0 else result := 15.0; end else result := 14.0; end; PS.: Die Erweiterung für 01.01.07 ist ja ein Kinderspiel! |
Re: Ersatz für DISTINCT ??
Hallo Frank,
Zitat:
Freundliche Grüße vom marabu |
Re: Ersatz für DISTINCT ??
Zitat:
Das leuchtet mit ein, danke für die Erläuterung! Frank :coder: |
Re: Ersatz für DISTINCT ??
Moin!
SQL-Code:
Hilft das?
select max(MWSTWERT_OUT) from
(select MWSTWERT_OUT from Tabelle where ABDATUM_OUT <= Datum) Viele Grüße Markus :gruebel: |
Re: Ersatz für DISTINCT ??
Hi Hansa,
was gefällt dir an meiner Procedure nicht. Sie liefert genau das, was du willst. Und onlinekater ist ja genau zum gleichen Ergebnis gekommen. Cu, Frank |
Re: Ersatz für DISTINCT ??
Zitat:
Nein, das funktioniert nicht korrekt. Wenn Du z. B. folgende Daten hast: Zitat:
Zitat:
Mir ist gerade erst aufgefallen, das ich fast dieselbe Procedure gepostet habe, wie Frank. Da habe ich nicht so ganz aufgepaßt. Meine Zusatzbemerkungen passen zu seiner Procedure genauso wie zu meiner. Gruß Thomas |
Re: Ersatz für DISTINCT ??
Hi Hansa,
wie wäre es denn damit:
SQL-Code:
alex
CREATE PROCEDURE ERMITTLE_ALLEMWSTSP (
ABDATUM DATE) RETURNS ( ID_OUT INTEGER, MWSTSATZ_OUT INTEGER, ABDATUM_OUT DATE, MWSTWERT_OUT DECIMAL(15,2)) AS BEGIN if (ABDATUM is NULL) then ABDATUM = CURRENT_DATE; for select distinct S.MWSTSATZ from mwst S into :MWSTSATZ_OUT DO BEGIN for select first 1 M.ID, M.ABDATUM, M.MWSTWERT from mwst M where M.MWSTSATZ = :MWSTSATZ_OUT and M.ABDATUM <= :ABDATUM order by M.ABDATUM desc INTO :ID_OUT, :ABDATUM_OUT, :MWSTWERT_OUT DO SUSPEND; END END |
Re: Ersatz für DISTINCT ??
Hi,
es geht auch mit "reinem" SQL:
SQL-Code:
Ungetestet, sollte aber passen. Ob das jetzt besonders performant ist kann ich nicht sagen. Das dürfte bei der kleinen Tabelle aber sowieso nichts ausmachen.
select m1.MWSTSATZ, m1.MWSTWERT
from MWST m1 join MWST m2 using (MWSTSATZ) where m2.ABDATUM_OUT <= :ABDATUM group by m1.MWSTSATZ, m1.ABDATUM, m1.MWSTWERT having m1.ABDATUM = max(m2.ABDATUM) order by m1.MWSTSATZ into :MWSTSATZ_OUT, :MWSTWERT_OUT |
Re: Ersatz für DISTINCT ??
Hi Niko
Zitat:
..wenn man "using (MWSTSATZ)" durch
SQL-Code:
ersetzt.
on (m2.MWSTSATZ = m1.MWSTSATZ)
alex |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:49 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 by Thomas Breitkreuz