2013-04-17 7 views
5

Die folgende Eingabeaufforderung muss beantwortet werden:SQL Nested Aggregate Query- Wie erhalte ich die Anzahl der Kunden pro Mitarbeiter?

Die Anzahl der Kunden für jeden Mitarbeiter auflisten. Geben Sie den Namen des Mitarbeiters und die Nummer der Kunden an, die entsprechend gekennzeichnet sind und den Mitarbeiter zuerst mit den meisten Kunden auflisten.

Hier finden Sie meine Mitarbeiter Tabelle:

create table EMPLOYEES 
    (EmpID char(4)   unique Not null, 
    Ename varchar(10), 
    Job  varchar(9), 
    MGR  char(4), 
    Hiredate date, 
    Salary decimal(7,2), 
    Comm  decimal(7,2), 
    DeptNo char(2)   not null, 
     Primary key(EmpID), 
     Foreign key(DeptNo) REFERENCES DEPARTMENTS(DeptNo)); 


insert into EMPLOYEES values (7839,'King','President',null,'17-Nov-11',5000,null,10); 
insert into EMPLOYEES values (7698,'Blake','Manager',7839,'01-May-11',2850,null,30); 
insert into EMPLOYEES values (7782,'Clark','Manager',7839,'02-Jun-11',2450,null,10); 
insert into EMPLOYEES values (7566,'Jones','Manager',7839,'02-Apr-11',2975,null,20); 
insert into EMPLOYEES values (7654,'Martin','Salesman',7698,'28-Feb-12',1250,1400,30); 
insert into EMPLOYEES values (7499,'Allen','Salesman',7698,'20-Feb-11',1600,300,30); 
insert into EMPLOYEES values (7844,'Turner','Salesman',7698,'08-Sep-11',1500,0,30); 
insert into EMPLOYEES values (7900,'James','Clerk',7698,'22-Feb-12',950,null,30); 
insert into EMPLOYEES values (7521,'Ward','Salesman',7698,'22-Feb-12',1250,500,30); 
insert into EMPLOYEES values (7902,'Ford','Analyst',7566,'03-Dec-11',3000,null,20); 
insert into EMPLOYEES values (7369,'Smith','Clerk',7902,'17-Dec-10',800,null,20); 
insert into EMPLOYEES values (7788,'Scott','Analyst',7566,'09-Dec-12',3000,null,20); 
insert into EMPLOYEES values (7876,'Adams','Clerk',7788,'12-Jan-10',1100,null,20); 
insert into EMPLOYEES values (7934,'Miller','Clerk',7782,'23-Jan-12',1300,null,10); 

Die folgende Tabelle meine Kunden ist:

create table CUSTOMERS 
    (CustID  char(6)  unique Not null, 
    Name  varchar(45), 
    Address  varchar(40), 
    City  varchar(30), 
    State  varchar(2), 
    Zip   varchar(9), 
    AreaCode char(3), 
    Phone  varchar (9), 
    RepID  char(4)  not null, 
    CreditLimit decimal(9,2), 
    Primary key(CustID), 
     Foreign key(RepID) References EMPLOYEES(EmpID)); 


insert into CUSTOMERS values (100,'Jocksports','345 Viewridge','Belmont','CA','96711',415,'598-6609',7844,5000); 
insert into CUSTOMERS values (101,'TKB Sport Shop','490 Boli Rd.','Redwood City','CA','94061',415,'368-1223',7521,10000); 
insert into CUSTOMERS values (102,'Vollyrite','9722 Hamilton','Burlingame','CA','95133',415,'644-3341',7654,7000); 
insert into CUSTOMERS values (103,'Just Tennis','Hillview Mall','Burlingame','CA','97544',415,'677-9312',7521,3000); 
insert into CUSTOMERS values (104,'Every Mountain','574 Surry Rd.','Cupertino','CA','93301',408,'996-2323',7499,10000); 
insert into CUSTOMERS values (105,'K + T Sports','3476 El Paseo','Santa Clara','CA','91003',408,'376-9966',7844,5000); 
insert into CUSTOMERS values (106,'Shape Up','908 Sequoia','Palo Alto','CA','94301',415,'364-9777',7521,6000); 
insert into CUSTOMERS values (107,'Womens Sports','Valco Village','Sunnyvale','CA','93301',408,'967-4398',7499,10000); 
insert into CUSTOMERS values (108,'North Woods Fitness Supply Center','98 Lone Pine Way','Hibbing','MN','55649',612,'566-9123',7844,8000); 

Das folgende ist meine Frage:

select ename, empId 
from EMPLOYEES 
where EmpID in 
(select count(repid) as NumberOfCustomers 
from CUSTOMERS 
group by RepID); 

Warum ist die Abfrage nicht Arbeiten?

Ich weiß, ich möchte die empid von EMPLOYEES mit der repID in KUNDEN übereinstimmen und dann COUNT, wie oft die rep-ID in KUNDEN angezeigt wird. Der einzige Grund, warum ich die Tabelle EMPLOYEES brauche, ist, Ename zu veröffentlichen. Im verwirrt über die syntaxt Ich brauche zu verwenden, weil ich die Ausgabe muß die Anzahl der REPID in der Tabelle CUSTOMERS

+2

+1 für die Skripte veröffentlichen. Alle machen es wie Jeff Oris! – Quassnoi

+0

@Quassnoi: Außer zum Posten scheinbar Hausaufgaben:/ – mellamokb

Antwort

1

Sie auch Common Table Expression verwenden können, wenn Sie SQL Server 2005 verwenden und darüber.

;WITH CTE 
AS 
(
    SELECT RepID, COUNT(*) AS CNT 
    FROM CUSTOMERS 
    GROUP BY REPID 
) 

SELECT E.Ename, E.EmpID, ISNULL(C.CNT, 0) 
FROM EMPLOYEES E 
LEFT OUTER JOIN CTE C ON C.RepID = E.EmpID 

DEMO

0

Ihre innere Abfrage nur ein count(repid), die eine Zählung ist, nicht die tatsächliche EmployeeID, die Ihre äußeree Abfrage erfordert in where EmpID in (xxx) . Nicht sicher, warum bist du eine Zählung in der inneren Abfrage möchten, weil Sie es im Endergebnis verlieren werde, aber dies sollte funktionieren:

select ename, empId 
from EMPLOYEES 
where EmpID in (
    select repID 
    from CUSTOMERS); 
+1

Ich bekomme die folgende Fehlermeldung: Nur ein Ausdruck kann in der Auswahlliste angegeben werden, wenn die Unterabfrage nicht mit EXISTS eingeführt wird. –

+0

Versuchen Sie die aktualisierte Version. Sie müssen keine Gruppe erstellen, indem Sie Kunden nach repID zählen, wenn Sie sie in der endgültigen Abfrage nicht anzeigen. Sie könnten auch einen inneren Join machen, aber ich dachte mir, Sie wollten die innere Abfrage aus einem bestimmten Grund. – mjuarez

+0

Das funktioniert nicht für mich. Denkst du, ich sollte irgendwo EXISTS benutzen? –

1
SELECT * 
FROM employees e 
CROSS APPLY 
     (
     SELECT COUNT(*) 
     FROM customers c 
     WHERE c.repId = e.empId 
     ) cc (cnt) 
ORDER BY 
     cnt DESC 

Sehen Sie diese auf SQLFiddle

Die gleiche mit einer Unterabfrage:

SELECT *, 
     (
     SELECT COUNT(*) 
     FROM customers c 
     WHERE c.repId = e.empId 
     ) cnt 
FROM employees e 
ORDER BY 
     cnt DESC 
+0

Ich darf nicht CROSS APPLY verwenden –

+0

@JeffOrris: nicht erlaubt von wem, darf ich fragen? Ist es eine Hausaufgabe? – Quassnoi

+0

ja. Ich habe eine schwere Zeit damit, weil mein DB-Kurs abgesagt wurde und ich das alleine lerne. Mein DB-Buch hat keine guten Beispiele. –

0

Was ist damit? oder habe ich falsch verstehen

SELECT ename, count(*) as NumCustomers 
FROM Customers INNER JOIN 
Employees ON customers.repid = employees.empid GROUP BY repid,ename 
ORDER BY numCustomers DESC 
+0

Ich kann keinen INNER JOIN verwenden, muss eine verschachtelte Abfrage sein, um die Effizienz zu maximieren –

+0

Da Sie den Namen des Mitarbeiters brauchen, ist es nicht immer effizienter, ihn wieder in die Tabelle mit den Mitarbeitern einzufügen? Da Sie die Anzahl aus der Tabelle customers und den entsprechenden Namen des Mitarbeiters behalten müssen, zeichne ich ein leeres, wie man das macht, ohne sie zu verbinden. – Scotch

+0

Ich wurde in der Klasse gesagt, dass anstelle einer Join, eine verschachtelte Abfrage immer weniger Ressourcen verwendet –

Verwandte Themen