none
Nicht gefundene Werte als NULL zurückgeben RRS feed

  • Frage

  • Hallo alle,

    ich möchte zu einer Sammlung von Betriebsaufträgen, die letzte Rückmeldung zurückgeben. Problem dabei ist, dass es Betriebsaufträge gibt, auf denen noch nichts zurückgemeldet wurde.

    Das Skript sieht s aus:

    DECLARE @verkauf table(num3 bigint, num2 varchar(15), art int,name varchar(60), pwert float, kname1 varchar(60),
    	banummer bigint, tabnr int, lastrm bigint, fertstand float);
    WITH
    	ba AS (SELECT a.num26,a.yverw,a.yart,MAX(b.tabnr) AS tabnr FROM [dkw-net].dbo.eks_faarchiv AS a
    		INNER JOIN [dkw-net].dbo.eks_faapos AS b ON a.num26=b.num26
    		WHERE ytsterm>'20110101'
    		GROUP BY a.num26,a.yverw,a.yart),
    	allerm AS (SELECT num9/1000 AS banum, num9 AS rm FROM eks_rueckmel
    		WHERE (vom BETWEEN '20110101' AND '20120226') AND left(num9,1)='9'),
    	letzterm AS (SELECT banum, MAX(rm) AS lastrm 
    		,ISNULL(CAST(right(MAX(rm),3) AS float)/CAST(ba.tabnr AS float),0) AS fertstand 
    		FROM allerm
    		INNER JOIN ba ON banum=ba.num26
    		GROUP BY banum,ba.tabnr)
    INSERT INTO @verkauf
          SELECT a.num3,a.num2,a.art,a.name,a.pwert,a.kname1
    		,b.num26
    		,b.tabnr
    		,c.lastrm
    		,c.fertstand 
    		FROM qry_eks_verkauf as a
    	  INNER JOIN ba AS b ON a.num3=b.yverw AND a.art=b.yart
    	  INNER JOIN letzterm AS c ON b.num26=c.banum
          WHERE (a.typ='Auftrag' AND a.limge>0)
          AND (a.num2 NOT LIKE '71%' AND a.num2 NOT LIKE '1%000' AND a.num2 NOT LIKE '2%000'
          AND a.num2 != '25') AND a.vom>'20110101';
    select * from @verkauf;

    Erläuterung:

    Die CTE "ba" holt die Betriebsaufträge, die CTE "allerm" holt Rückmeldungen, "letzterm" sucht die letzte Rückmeldung zu jedem Betriebsauftrag. Zum Schluss wird die Ergebnismenge noch durch die aktiven Aufträgen gefiltert.

    Bei "letzterm" beginnen die Probleme. Gibt es keine Rückmeldung, so gibt "letzterm" auch keine Zeile zurück. Wie kann ich es also so gestalten, dass dann die Spalten lastrm und fertstand als NULL zurückgegeben werden?

    Grüße

      Heiko

    Freitag, 9. März 2012 08:07

Antworten

  • Hallo Heiko,

    wenn ich Dich richtig verstanden habe, sollte ein LEFT JOIN statt dem INNER reichen:

     LEFT JOIN letzterm AS c ON b.num26=c.banum


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    • Als Antwort markiert Heiko Sturm Freitag, 9. März 2012 08:29
    Freitag, 9. März 2012 08:19

Alle Antworten

  • Hallo Heiko,

    wenn ich Dich richtig verstanden habe, sollte ein LEFT JOIN statt dem INNER reichen:

     LEFT JOIN letzterm AS c ON b.num26=c.banum


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    • Als Antwort markiert Heiko Sturm Freitag, 9. März 2012 08:29
    Freitag, 9. März 2012 08:19
  • Hallo Olaf,

    ich weiß zwar nicht warum, aber es funktioniert.

    Danke.

      Heiko

    Freitag, 9. März 2012 08:29
  • Das ist der Sinn von OUTER JOINS, hier bei LEFT eben "nimm alles aus der linken Tabelle und von der rechten nur die matchend Datensätze, sonst liefere ein leeres Ergebnis"

    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    Freitag, 9. März 2012 08:33