Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   JOIN geht nicht (https://www.delphipraxis.net/172403-join-geht-nicht.html)

Hansa 1. Jan 2013 15:38

Datenbank: Firebird • Version: 2.5 • Zugriff über: IBExpert

JOIN geht nicht
 
Prost Neujahr,

habe hier folgende Stored Procedure :

Code:
CREATE PROCEDURE NEW_PROCEDURE
returns (
    artnr integer,
    jahrout integer,
    mon01 decimal(15,2))
as
begin
  FOR SELECT
    NR AS ARTNR,
    JAHR,
    SUM (CASE MONAT WHEN 1 Then
           UMSATZ
           ELSE
             0
         END) as Mon01
FROM STAT S RIGHT JOIN ART A ON S.ID_ART=A.ID WHERE (JAHR = 2011 OR
   JAHR=2012) AND
  (ID_KUNDE=0) AND (A.ID=2871839) GROUP BY ARTNR,JAHR
  INTO :ARTNR,:JAHROUT,:MON01 do
  suspend;
end
Pro Artikel brauche ich 2 Zeilen (für Statistik, hier eine für 2011 und 2012). Die sind auch meistens da. Allerdings nur dann, wenn zu einem Artikel tatsächlich ein Statistik-Datensatz existiert. Ist keiner da, dann ist nur 1 Zeile zu sehen. Es heisst aber auch so :

"RIGHT JOIN: Return all rows from the right table, even if there are no matches in the left table"

Wo ist da jetzt der Denkfehler ? Es sollen immer 2 Zeilen in der Datenmenge sein, selbst wenn zu den entsprechenden Artikeln keine Statistik-Daten existieren.

Furtbichler 1. Jan 2013 15:47

AW: JOIN geht nicht
 
Deine WHERE-Klausel dürfte Dir deinen Neujahrstag vermiesen, schätze ich.

:party: Neujahr.

jobo 1. Jan 2013 16:24

AW: JOIN geht nicht
 
Dein right join bezieht sich nur auf die Artikel ID. Es werden also auch Artikel angezeigt, die auf der einen Seite nicht vorhanden sind.
Die Where Clause mit Jahreseinschränkung hat damit nichts zu tun.
Aus dem SQL geht mangels Spaltenalias auch nicht hervor, woher das Jahr kommt.
Um sicherzugehen, dass die gewünschten Jahre immer dabei sind, könnte man sie als separate Liste/Select/View einbinden und dort dann mit Outer Join zum Artikeljahr verbinden (Pivot Verfahren).
Also in die From Clause eine 3.Menge mit den Jahren rein. Z.B. so für firebird(?):
Code:
(select 2011 as Jahr from RDB$DATABASE
  union all
 select 2012 from RDB$DATABASE) as Jahre


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:48 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-2025 by Thomas Breitkreuz