2013-04-17 15 views
5

Sau đây là lời nhắc tôi cần trả lời:Truy vấn tổng hợp SQL lồng nhau- Làm thế nào để tôi nhận được số lượng khách hàng trên mỗi nhân viên?

Liệt kê số lượng khách hàng cho mỗi nhân viên. Bao gồm tên và số lượng nhân viên của khách hàng được gắn nhãn thích hợp, liệt kê nhân viên có nhiều khách hàng nhất trước tiên.

Sau đây là bảng NHÂN VIÊN tôi:

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

Sau đây là bảng CUSTOMERS tôi:

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

Sau đây là câu hỏi của tôi:

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

Tại sao truy vấn của tôi không đang làm việc?

Tôi biết tôi muốn khớp với empid từ EMPLOYEES tới repID trong CUSTOMERS và sau đó COUNT bao nhiêu lần ID đại diện xuất hiện trong CUSTOMERS. Lý do duy nhất tôi cần bảng EMPLOYEES là đặt ra Ename. Im nhầm lẫn về cú pháp tôi cần sử dụng vì tôi cần xuất tổng số RepID trong bảng CUSTOMERS

+2

+1 cho đăng các kịch bản. Tất cả đều giống như Jeff Oris! – Quassnoi

+0

@Quassnoi: Ngoại trừ việc đăng bài tập về nhà rõ ràng:/ – mellamokb

Trả lời

1

Bạn cũng có thể sử dụng Common Table Expression nếu bạn đang sử dụng SQL Server 2005 trở lên.

;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

Truy vấn bên trong của bạn chỉ có một số count(repid), không phải là EmployeeID thực tế mà truy vấn bên ngoài của bạn yêu cầu trong where EmpID in (xxx) . Không chắc why're bạn muốn có một số trong truy vấn bên trong của bạn, bởi vì bạn sẽ bị mất nó trong kết quả cuối cùng, nhưng điều này sẽ làm việc:

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

Tôi nhận được thông báo lỗi sau: Chỉ có thể chỉ định một biểu thức trong danh sách chọn khi truy vấn phụ không được giới thiệu với EXISTS. –

+0

Thử phiên bản cập nhật. Bạn không cần phải làm một nhóm bằng cách, đếm khách hàng bằng repID, khi bạn sẽ không hiển thị nó trong truy vấn cuối cùng. Bạn cũng có thể làm điều đó một sự tham gia bên trong, nhưng tôi nghĩ bạn muốn truy vấn bên trong vì một lý do. – mjuarez

+0

Điều này không hiệu quả đối với tôi. Bạn có nghĩ rằng tôi nên sử dụng một EXISTS ở đâu đó? –

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

Xem này trên SQLFiddle

Cùng với một truy vấn phụ:

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

Tôi không được phép sử dụng CROSS ÁP DỤNG –

+0

@ JeffOrris: không được ai cho phép, tôi có thể yêu cầu không? Đây có phải là bài tập về nhà không? – Quassnoi

+0

có. Tôi có một thời gian khó khăn với điều này vì lớp DB của tôi đã bị hủy và tôi tự học tôi. Cuốn sách DB của tôi không có ví dụ hay. –

0

Điều này thì sao? hoặc tôi đã hiểu nhầm

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

Tôi không thể sử dụng INNER JOIN, phải là một truy vấn lồng nhau để tối đa hóa hiệu quả –

+0

Vì bạn cần tên của nhân viên, không phải lúc nào cũng hiệu quả hơn khi tham gia lại bảng nhân viên? Vì bạn cần phải giữ lại số lượng từ bảng khách hàng và cũng là tên của nhân viên tương ứng với điều đó, tôi đang vẽ một khoảng trống để làm điều đó mà không cần tham gia chúng. – Scotch

+0

Tôi được cho biết trong lớp học chứ không phải là tham gia, truy vấn lồng nhau luôn sử dụng ít tài nguyên hơn –

Các vấn đề liên quan