AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Ersatz für DISTINCT ??
Thema durchsuchen
Ansicht
Themen-Optionen

Ersatz für DISTINCT ??

Ein Thema von Hansa · begonnen am 3. Aug 2006 · letzter Beitrag vom 4. Aug 2006
Antwort Antwort
Seite 3 von 3     123   
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.893 Beiträge
 
Delphi 12 Athens
 
#21

Re: Ersatz für DISTINCT ??

  Alt 4. Aug 2006, 14:34
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
Thomas Breitkreuz
  Mit Zitat antworten Zitat
alex517

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
 
Delphi XE5 Enterprise
 
#22

Re: Ersatz für DISTINCT ??

  Alt 4. Aug 2006, 14:38
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?
Alexander
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.893 Beiträge
 
Delphi 12 Athens
 
#23

Re: Ersatz für DISTINCT ??

  Alt 4. Aug 2006, 15:06
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 ....

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
Thomas Breitkreuz
  Mit Zitat antworten Zitat
alex517

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
 
Delphi XE5 Enterprise
 
#24

Re: Ersatz für DISTINCT ??

  Alt 4. Aug 2006, 15:34
[krümelkackermodus]

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

[/krümelkackermodus]
alex
Alexander
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.893 Beiträge
 
Delphi 12 Athens
 
#25

Re: Ersatz für DISTINCT ??

  Alt 4. Aug 2006, 16:02
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


yep, Deine Methode ist hier schneller

Gruß

Thomas
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#26

Re: Ersatz für DISTINCT ??

  Alt 4. Aug 2006, 16:16
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 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
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#27

Re: Ersatz für DISTINCT ??

  Alt 4. Aug 2006, 17:43
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#28

Re: Ersatz für DISTINCT ??

  Alt 4. Aug 2006, 20:30
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 10:42 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