2016-06-20 7 views
0

Ich erhalte die folgende Fehlermeldung;Unterabfrage hat mehr als 1 Wert zurückgegeben, Fehler

Die Unterabfrage ergab mehr als 1 Wert. Dies ist nicht zulässig, wenn die Unterabfrage folgt =,! =, <, < =,>,> = oder wenn die Unterabfrage als Ausdruck verwendet wird.

Der Abschnitt des Codes, mit dem ich Probleme habe, ist in meiner Select-Anweisung;

Momentan funktioniert es, wenn die Person nur einen Datensatz in der Testtemp-Tabelle hat, aber auseinanderfällt, wenn es zwei gibt. Ich weiß, dass ich Top 1 verwenden könnte, um es zu begrenzen, aber das ist nicht das, was ich will. L stammt aus der Hauptauswahlanweisung.

Ok, so dass die temporäre Tabelle hat folgende Daten:

ID startdate 
1 2014-10-02 
1 2014-11-02 
2 2014-11-02 

Mit dem TOP 1 in meinem Code erhalte ich die Ergebnisse unter:

ID ~Other Stuff~ SC 
1 ~~~~~~~~~~~~~ 1 
2 ~~~~~~~~~~~~~ 1 

Aber was ich will zurückgegeben werden soll:

ID ~Other Stuff~ SC 
1 ~~~~~~~~~~~~~ 2 
2 ~~~~~~~~~~~~~ 1 

Wie kann ich meinen Code ändern, um dies zu erreichen?

Danke.

+1

Um eine gute Antwort zu erhalten, müssen Sie immer noch die "main" 'from'-Klausel anzeigen, anstatt nur die Unterabfrage. Konzeptuell möchten Sie die 'group by' in der Unterabfrage loswerden und die' where' -Klausel verwenden, um sie im wesentlichen mit der Hauptabfrage mit einer 'where sch.id = main.id'-Zeile zu verbinden. – tarheel

Antwort

0

Es hängt davon ab, was Sie zu zählen versuchen. Es erscheint auch (ohne zusätzliche Information), dass Sie die HAVING-Klausel in die WHERE-Klausel verschieben können.

Wenn Sie versuchen, Zeilen aus #test diesem Spiel zu zählen:

,(SELECT COUNT(*) 
    FROM #test AS sch 
    WHERE L.Id = sch.id 
    AND sch.startdate >= L.T_Start AND sch.startdate <= @END) AS SC 

Wenn Sie eindeutige Werte startdate zu zählen versuchen:

,(SELECT COUNT(DISTINCT sch.startdate) 
    FROM #test AS sch 
    WHERE L.Id = sch.id 
    AND sch.startdate >= L.T_Start AND sch.startdate <= @END) AS SC 

Wenn Sie einzigartige Kombinationen zu zählen versuchen, (ID, Startdatum) Dann denke ich, dass Sie eine andere Ebene der Abfrage benötigen:

Siehe COUNT (Transact-SQL)

0

Entfernen Sie sch.startdate von der GROUP BY. Sie möchten die StartDates zählen und nicht nach ihnen gruppieren.

+0

Ich würde denken, dass es die ganze GROUP BY ist, die entfernt werden sollte, weil das dann noch von L.Id gruppiert würde. –

+0

Es ist wahr, dass Sie die gesamte Gruppe durch entfernen können und die gewünschten Ergebnisse erhalten, aber ich erwähnte nur Startdatum, weil das der Teil ist, der das unerwünschte Verhalten verursacht. –

0

HAVING wird verwendet, um Gruppen herauszufiltern, bei denen eine Bedingung für die gesamte Gruppe zutrifft. Typischerweise ist dies ein Aggregat aus Ihrer Gruppierung, z.

HAVING sum(amount) > 10 

Sie setzen

HAVING sch.startdate >= L.T_Start --... 

die die L.T_start auf Zeilenebene zieht (da es nicht ein Aggregat ist und nicht in der GROUP BY).

Je nachdem, was Sie zu tun versuchen, entweder

Schritt, zu der WHERE-Klausel (filtern Zeilen aus der Anweisung vorge Gruppierung)

oder

ihm ein Aggregat machen (zB HAVING max (sch.startdate> L.T_start) usw.

oder

Gruppe von diesem Zustand zB grou p by - ..., CASE wenn sch.startdate> L.T_start dann 1 else 0 end - ... beachten Sie, dass die letzte Option Ihnen zwei Gruppen geben könnte, also sollten Sie auch diese CASE-Anweisung als einschließen eine Spalte in Ihrer Auswahlliste, um den Unterschied zu identifizieren.

Verwandte Themen