2013-04-17 5 views
5

Il seguente è il prompt a cui devo rispondere:Query aggregata annidata SQL- Come ottengo il numero di clienti per dipendente?

Elencare il numero di clienti per ciascun dipendente. Includere il nome e il numero di dipendenti clienti etichettati in modo appropriato, elencando prima il dipendente con il maggior numero di clienti.

Quello che segue è la mia tabella dipendenti:

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); 

Quello che segue è la mia tabella CLIENTI:

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); 

Quello che segue è la mia domanda:

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

Perché è la mia domanda non è lavoro?

So che voglio abbinare l'empid da DIPENDENTI al repID in CLIENTI e poi CONTA quante volte l'ID rappresentante viene visualizzato in CLIENTI. L'unica ragione per cui ho bisogno della tabella EMPLOYEES è di mettere Ename. Im confuso circa la syntaxt ho bisogno di usare perché ho bisogno di uscita il conteggio dei repid nella tabella CLIENTI

+2

+1 per la pubblicazione gli script. Tutti fanno come Jeff Oris! – Quassnoi

+0

@Quassnoi: Tranne l'invio di compiti apparenti:/ – mellamokb

risposta

1

È inoltre possibile utilizzare Common Table Expression se si sta utilizzando SQL Server 2005 e superiori.

;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

vostra query interna ha solo una count(repid), che è un conteggio, non l'EmployeeID reale che la query esterna richiede in where EmpID in (xxx) . Non è sicuro perché sei desidera un conteggio nella query interna, perché si perde nel risultato finale, ma questo dovrebbe funzionare:

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

Viene visualizzato il seguente messaggio di errore: È possibile specificare solo un'espressione nell'elenco di selezione quando la sottoquery non viene introdotta con EXISTS. –

+0

Prova la versione aggiornata. Non è necessario fare un gruppo, contando i clienti per repID, quando non lo mostrerai nella query finale. Potresti anche fare un join interno, ma ho pensato che volevi la query interna per un motivo. – mjuarez

+0

Questo non funziona per me. Pensi che dovrei usare un ESISTE da qualche parte? –

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

vedere questo sul SQLFiddle

Lo stesso con una sottoquery:

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

Non mi è permesso usare CROSS APPLY –

+0

@JeffOrris: non consentito da chi, posso chiedere? È un compito? – Quassnoi

+0

sì. Sto avendo un momento difficile con questo perché la mia classe DB è stata annullata e Im imparando questo da solo. Il mio libro DB non ha buoni esempi. –

0

Che dire di questo? O ho capito male

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

Non riesco a utilizzare un JOIN INTERNO, deve essere una query nidificata per massimizzare l'efficienza –

+0

Dal momento che è necessario il nome del dipendente, non sarà sempre più efficiente unirsi nuovamente alla tabella dei dipendenti? Dal momento che è necessario conservare il conteggio dalla tabella dei clienti e anche il nome del dipendente che corrisponde a quello, sto disegnando un vuoto su come farlo senza unirli. – Scotch

+0

Mi è stato detto in classe che anziché un join, una query nidificata utilizza sempre meno risorse –

Problemi correlati