【问题标题】:SQL Nested Aggregate Query- How do I get the number of customers per employee?SQL 嵌套聚合查询 - 如何获取每位员工的客户数量?
【发布时间】:2013-04-17 21:30:14
【问题描述】:

以下是我需要回答的提示:

列出每位员工的客户数量。包括员工姓名和人数 客户标签适当,首先列出客户最多的员工。

以下是我的 EMPLOYEES 表:

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

以下是我的 CUSTOMERS 表:

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

以下是我的查询:

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

为什么我的查询不起作用?

我知道我想将 EMPLOYEES 中的 empid 与 CUSTOMERS 中的 repID 相匹配,然后计算 rep ID 在 CUSTOMERS 中出现的次数。我需要 EMPLOYEES 表的唯一原因是输出 Ename。我对需要使用的语法感到困惑,因为我需要在 CUSTOMERS 表中输出 RepID 的计数

【问题讨论】:

  • +1 用于发布脚本。都像 Jeff Oris 那样做!
  • @Quassnoi:除了发布明显的作业:/

标签: sql sql-server-2008 subquery


【解决方案1】:

如果您使用SQL Server 2005 及以上版本,您也可以使用Common Table Expression

;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

【讨论】:

    【解决方案2】:
    SELECT  *
    FROM    employees e
    CROSS APPLY
            (
            SELECT  COUNT(*)
            FROM    customers c
            WHERE   c.repId = e.empId
            ) cc (cnt)
    ORDER BY
            cnt DESC
    

    SQLFiddle上看到这个

    子查询也一样:

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

    【讨论】:

    • 我不允许使用 CROSS APPLY
    • @JeffOrris:谁不允许,请问?这是作业吗?
    • 是的。我很难解决这个问题,因为我的 DB 课被取消了,我自己学习了。我的数据库书没有很好的例子。
    • 我应该在某处使用 EXISTS 进行嵌套查询吗?
    【解决方案3】:

    您的内部查询只有一个count(repid),这是一个计数,而不是您的外部查询在where EmpID in (xxx) 中需要的实际 EmployeeID。不确定为什么要在内部查询中进行计数,因为您会在最终结果中丢失它,但这应该可以:

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

    【讨论】:

    • 我收到以下错误消息:当子查询不使用 EXISTS 引入时,选择列表中只能指定一个表达式。
    • 试用更新版本。当您不会在最终查询中显示它时,您不需要按 repID 计算客户数。你也可以做一个内部连接,但我认为你想要内部查询是有原因的。
    • 这对我不起作用。你认为我应该在某处使用 EXISTS 吗?
    • 您遇到的错误是什么?还是错误的输出数据?这对尝试诊断问题非常有帮助。
    【解决方案4】:

    这个呢?还是我误会了

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

    【讨论】:

    • 我不能使用 INNER JOIN,必须是嵌套查询才能最大限度地提高效率
    • 既然您需要员工的姓名,那么将其加入到员工表中不是总是更有效率吗?由于您需要保留客户表中的计数以及与之对应的员工姓名,因此我在不加入他们的情况下如何做到这一点。
    • 我在课堂上被告知,嵌套查询总是使用更少的资源,而不是连接
    • @JeffOrris “我在课堂上被告知”,不应该是“我们在课堂上被告知”吗?谁告诉你嵌套查询使用的资源更少,他/她是你的同学还是你的老师?
    • @Michael Buen 教授告诉我们的。但是,查看提示后,无法对此进行嵌套查询。跟她说完,就加入了。我很困惑,因为它是一个嵌套查询分配。给您带来的不便,我们深表歉意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    相关资源
    最近更新 更多