creamycewie
Goto Top

TSQL - Die Unterabfrage hat mehr als einen Wert zurückgegeben

Hallöchen.

Ich habe in meiner SQL-DB eine Select-Abrafe, in welcher ich eine Unterabfrage enthalten habe.

Der Code sieht folgend aus:
select 
	PCKassE, 
        (select SUM(Betrag) from KASSEBAR where Datum >= :Von_Datum and Datum <= :Bis_Datum ) AS EinlageEntnahme ,
        BelegNummer, 
        Datum, 
        Adressnummer, 
        Firma, 
        Erloes, 
        Netto, 
        Steuer, 
        Brutto
from beleg 
where 
	Datum >= :Von_Datum 
	and Datum <= :Bis_Datum 
        and Belegtyp = 'K'   
        and Adressnummer != ''  
order by Belegnummer


Hier erhalte ich die Fehlermeldung "Die Unterabfrage hat mehr als einen Wert zurückgegeben".

Mit meinem zweiten Select hole ich mir die Gesamtsumme aller Beträge in der Tabelle "KASSEBAR".
Wenn ich diese Abfrage alleine, also losgelöst vom Select from beleg starte, erhalte ich nur einen Wert.
Warum kommt dann die Fehlermeldung dass mehrere Werte zurückgegeben wurden?
Mit SUM sollte ich doch nur eine Gesamtsumme (also einen Wert) zurückbekommen, oder?


Lieben Dank!

Content-ID: 385294

Url: https://administrator.de/contentid/385294

Ausgedruckt am: 23.11.2024 um 05:11 Uhr

CreamyCewie
CreamyCewie 03.09.2018 um 13:01:28 Uhr
Goto Top
Hab nun einen Teilerfolg!

select 
	PCKasse, 
        (select Anfangsbestand from KASSE where Datum = :Von_Datum and PCKasse = '1' ) AS AB_1 ,  
        (select Anfangsbestand from KASSE where Datum = :Von_Datum and PCKasse = '3' ) AS AB_2 ,  
        (select SUM(Betrag) from KASSEBAR where Datum >= :Von_Datum and Datum <= :Bis_Datum ) AS EinlageEntnahme , 
        BelegNummer, 
        Datum, 
        Adressnummer, 
        Firma, 
        Erloes, 
        Netto, 
        Steuer, 
        Brutto,
        (select Endbestand from KASSE where Datum = :Bis_Datum and PCKasse = '1' ) AS EB_1 ,  
        (select Endbestand from KASSE where Datum = :Bis_Datum and PCKasse = '3' ) AS EB_2   

from beleg 
where 
	Datum >= :Von_Datum 
	and Datum <= :Bis_Datum 
        and Belegtyp = 'K'   
        and Adressnummer != ''  
order by Belegnummer


Ich habe herrausgefunden dass sich die Fehlermeldung auf die Zeile 3 bezieht.
Also liefert das erste Subselect zwei Werte zurück.
Ist es möglich das erste subselect so zu definieren, dass nur der ERSTE gefundene Datensatz ausgewertet wird?

Die Tabelle dahinter sieht folgend aus:
unbenannt
Das Probelm: die Tabelle KANN mehrere Datensätze enthalten, in denen "PCKassa" und "Datum" ident sind.
Wie kann ich die abfrage umdefinieren, um nur den ersten gefundenen Datensatz (niedrigster Wert im Feld "KASSA_ID") ausgegeben zu bekommen?

Lieben Dank!
MadMax
MadMax 03.09.2018 um 13:30:49 Uhr
Goto Top
Hallo CreamyCewie,

das geht mit "top (1)" und einem "order by":
...
(select top (1) Anfangsbestand from KASSE where Datum = :Von_Datum and PCKasse = '1' order by KASSA_ID) AS AB_1 ,
...

Gruß, Mad Max
ukulele-7
ukulele-7 03.09.2018 um 13:45:33 Uhr
Goto Top
So ein richtiger Join wäre ja auch ne tolle Sache aber dazu müsste man deine Daten besser verstehen. Leider postest du ja schon zwei unterschiedliche Abfragen als Fehlerquelle, welche Abfrage ist das denn nun?
em-pie
em-pie 03.09.2018 um 19:45:59 Uhr
Goto Top
Moin,


Zitat von @ukulele-7:

So ein richtiger Join wäre ja auch ne tolle Sache aber dazu müsste man deine Daten besser verstehen. Leider postest du ja schon zwei unterschiedliche Abfragen als Fehlerquelle, welche Abfrage ist das denn nun?

Das habe ich mir auch gedacht.
Vorfällen ist das deutlich Performance, als wenn für jede Zeile das Subselect nochmals ausgeführt werden muss...

Gruß
em-pie