Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Ich möchte mit dieser Abfrage alle Spalten der Kontentabelle abrufen, aber es gibt einen Fehler

Ihre Abfrage enthält eine Gruppieren-nach-Klausel. Wenn Sie eine group by-Klausel in der Abfrage verwenden, muss jede Spalte in der select-Anweisung eines von zwei Dingen tun – entweder muss sie Teil der group by-Liste sein, oder sie muss eine Art Aggregat sein (Sum , Anzahl, Durchschnitt, Max usw.). Wenn Sie dies nicht tun, weiß SQL nicht, was mit der Spalte geschehen soll. In Ihrem Fall sind Accounts.regno und Accounts.model in der Auswahl aufgeführt, aber sie sind nicht in der group by-Klausel und sie sind keine Aggregate - daher Ihr Fehler.

Angenommen, Sie haben zwei Kontodatensätze mit demselben Kontonamen und slacc, aber unterschiedlichem Regno (oder Modell). Die group by-Klausel besagt, dass sie zur Anzeige zu einem Datensatz zusammengefasst werden müssen, aber Sie haben SQL nicht gesagt, wie das geht. Es macht nichts, wenn die Daten nicht so sind, SQL sucht zuerst nach möglichen Fehlern.

In diesem Fall möchten Sie wahrscheinlich nur alle Details gruppieren. Am einfachsten ist es, sicherzustellen, dass Sie alle benötigten Spalten zur Gruppe hinzufügen, wie hier

select Accounts.name, Accounts.regno, Accounts.model, Accounts.slacc, count(servicing.dt) as total 
from Accounts 
   left outer join servicing on Accounts.slacc = servicing.slacc 
group by Accounts.slacc, Accounts.name, Accounts.regno, Accounts.model

Dies behebt den Fehler, führt jedoch eine zusätzliche Gruppierung durch, die Sie nicht benötigen, und würde sehr umständlich werden, wenn Sie viel mehr Spalten hätten, die Sie vom Konto haben möchten, da Sie sie alle hinzufügen müssten. Eine andere Möglichkeit, dies zu handhaben, besteht darin, die minimale Anzahl von Spalten für die Gruppenabfrage zu verwenden und dann das Ergebnis davon mit Ihrer Hauptabfrage zu verbinden, um die anderen Spalten zu erhalten. Das würde wahrscheinlich ungefähr so ​​aussehen

select Accounts.name, Accounts.regno, Accounts.model, Accounts.slacc, Totals.Total 
from Accounts
   left outer join 
     ( Select slacc, count(dt) as total
       from servicing
       group by slacc
     ) Totals on Totals.slacc = Accounts.slacc