Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Ersatz für DISTINCT ?? (https://www.delphipraxis.net/74472-ersatz-fuer-distinct.html)

TBx 4. Aug 2006 13:34

Re: Ersatz für DISTINCT ??
 
nicht überredet...

m2.ABDATUM_OUT gibt es nicht

Macht man dann daraus folgendes:

SQL-Code:
select m1.MWSTSATZ, m1.MWSTWERT
from MWST m1 join MWST m2 on (m2.MWSTSATZ = m1.MWSTSATZ)
where m2.ABDATUM <= :ABDATUM
group by m1.MWSTSATZ, m1.ABDATUM, m1.MWSTWERT
having m1.ABDATUM = max(m2.ABDATUM)
order by m1.MWSTSATZ
into :MWSTSATZ_OUT, :MWSTWERT_OUT
so erhält man eine leere Datenmenge.

Gruß

onlinekater

alex517 4. Aug 2006 13:38

Re: Ersatz für DISTINCT ??
 
hi onlinekater,
sei doch mal ein wenig flexibler :)

SQL-Code:
select
  m1.ID, m1.MWSTSATZ, m1.ABDATUM, m1.MWSTWERT
from
  MWST m1
  join MWST m2 on (m2.MWSTSATZ = m1.MWSTSATZ)
where
  m2.ABDATUM <= :ABDATUM
group by
  m1.ID, m1.MWSTSATZ, m1.ABDATUM, m1.MWSTWERT
having
  m1.ABDATUM = max(m2.ABDATUM)
order by
  m1.MWSTSATZ
jetzt überredet?

TBx 4. Aug 2006 14:06

Re: Ersatz für DISTINCT ??
 
Zitat:

Zitat von alex517
hi onlinekater,
sei doch mal ein wenig flexibler :)

nene, dass hat nichts mit Biegsamkeit zu tun.
Der Code, den Du geradr gepostet hast, ergänzt ja auch nur ein paar Felder.

Die leere Datenmenge kam nicht durch die SQL-Anweisung zustande, sondern dadurch, daß in meinem IBExpert neuerdings der Null-Haken nicht verschwindet,
wenn man einen Value einträgt .... :wall: :wall: :wall:

Werte sind nun da

Zitat:

jetzt überredet?
nö, sondern überzeugt.


Ich möchte aber dazu noch anmerken, daß die Methode von dataspider und mir weniger Reads benötigt (auch wenn diese indiziert sind).

Jetzt bleibt es Hansas Geschmack überlassen, was er einsetzen möchte.

Gruß

Thomas

alex517 4. Aug 2006 14:34

Re: Ersatz für DISTINCT ??
 
[krümelkackermodus]

Zitat:

Zitat von onlinekater
Ich möchte aber dazu noch anmerken, daß die Methode von dataspider und mir weniger Reads benötigt (auch wenn diese indiziert sind).

nach dem ich mir deine Bemerkung bezüglich GROUP BY <--> DISTINCT zu Herzen genommen habe,
jetz nochmal:

SQL-Code:
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
      S.MWSTSATZ
    from
      mwst S
    GROUP BY MWSTSATZ
    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
Ergebnis:
deine Variante 11 Reads
meine Variante 8 Reads
:-D
[/krümelkackermodus]
alex

TBx 4. Aug 2006 15:02

Re: Ersatz für DISTINCT ??
 
Zitat:

nach dem ich mir deine Bemerkung bezüglich GROUP BY <--> DISTINCT zu Herzen genommen habe,
jetz nochmal:
freut mich, daß ich noch ein bißchen Wissen vermitteln konnte :-D :-D


yep, Deine Methode ist hier schneller

Gruß

Thomas

Jürgen Thomas 4. Aug 2006 15:16

Re: Ersatz für DISTINCT ??
 
Hallo,

ich komme zwar etwas spät, aber vielleicht vereinfacht mein Verfahren doch einiges:
Füge in die Tabelle ein Feld DATUM_BIS ein, z.B:
Zitat:

Zitat von Hansa
MWSTSATZ ABDATUM DATUM_BIS MWSTWERT_OUT
0 01.01.1900 31.12.2999 0
1 01.01.1980 31.12.2999 7
2 01.01.1980 31.03.1998 15
2 01.04.1998 31.12.2006 16
2 01.01.2007 31.12.2999 19

Das erleichtert die gewünschte Abfrage ungemein:
SQL-Code:
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 ID,MWSTSATZ,ABDATUM, MWSTWERT FROM MWST WHERE :ABDATUM BETWEEN ABDATUM AND DATUM_BIS
  ORDER BY MWSTSATZ
  INTO :ID_OUT,:MWSTSATZ_OUT,:ABDATUM_OUT,:MWSTWERT_OUT
  DO
  SUSPEND;
end^
Damit wird die Änderung der MWSt-Sätze etwas erschwert, aber auch das geht in einer Stored Procedure, wenn sie auch mit Fallunterscheidungen arbeiten muss (neuer MWSt-Satz z.B. für Luxuswaren, Änderung des Geltungsbereichs). Wenn das gewünscht wird, kann ich meine Lösung mitliefern.

Übrigens scheint es mir einfacher zu sein, den MWSt-Satz als integer = Promille zu verwenden. Aber das ist sekundär (vielleicht gibt es aber auch MWSt-Sätze wie 7,25% - dann geht das natürlich nicht).

Jürgen

Sir Rufo 4. Aug 2006 16:43

Re: Ersatz für DISTINCT ??
 
Warum eigentlich nicht so?

Oder kann FB keine verschachtelten SELECTS?
SQL-Code:
  SELECT ID,MWSTSATZ,ABDATUM, MWSTWERT FROM MWST AS m WHERE ABDATUM IN (SELECT MAX(ABDATUM) FROM mwst n WHERE n.MWSTSATZ=m.MWSTSATZ AND n.ABDATUM<=:ABDATUM)
  ORDER BY MWSTSATZ
  INTO :ID_OUT,:MWSTSATZ_OUT,:ABDATUM_OUT,:MWSTWERT_OUT
  DO
cu

Oliver

Hansa 4. Aug 2006 19:30

Re: Ersatz für DISTINCT ??
 
Thx, Leute. Konnte erst jetzt wieder etwas genauer hier gucken und weiter machen. Die Alex Prozedur scheint zu gehen. Zumindest mit diesen Testdaten :

SQL-Code:
CREATE TABLE MWST (
    ID              INTEGER NOT NULL,
    MWSTSATZ        SMALLINT DEFAULT 0 NOT NULL,
    ABDATUM         DATE,
    MWSTWERT        DECIMAL(15,2)
);


INSERT INTO MWST (ID, MWSTSATZ, ABDATUM, MWSTWERT) VALUES (1, 2, '1998-04-01');
INSERT INTO MWST (ID, MWSTSATZ, ABDATUM, MWSTWERT) VALUES (2, 1, '1980-01-01');
INSERT INTO MWST (ID, MWSTSATZ, ABDATUM, MWSTWERT) VALUES (3, 2, '2007-01-01');
INSERT INTO MWST (ID, MWSTSATZ, ABDATUM, MWSTWERT) VALUES (4, 0, '1900-01-01');
INSERT INTO MWST (ID, MWSTSATZ, ABDATUM, MWSTWERT) VALUES (5, 2, '1990-01-01');
INSERT INTO MWST (ID, MWSTSATZ, ABDATUM, MWSTWERT) VALUES (6, 1, '1970-01-01');
INSERT INTO MWST (ID, MWSTSATZ, ABDATUM, MWSTWERT) VALUES (7, 2, '1970-01-01');
INSERT INTO MWST (ID, MWSTSATZ, ABDATUM, MWSTWERT) VALUES (8, 2, '1980-01-01');

COMMIT WORK;
Das soll jetzt aber nicht heißen, daß die anderen nicht gehen ! Die einzige, die definitiv nicht richtig war, das ist die von mir. :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:53 Uhr.
Seite 3 von 3     123   

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