2012-06-26 22 views
1

我成功地编写了查询,列出了销售人员向特定客户销售的销售人员,但没有销售给那些没有销售的销售人员。我怀疑这是因为销售给特定客户的同一销售员也出售给其他客户。在编写列出所有销售人员并没有销售给特定客户的查询时遇到问题

select a.name from salesperson a inner join orders b on 
    a.salesperson_id = b.salesperson_id where cust_id="4"; 

我在想,修改同一查询这样会做的伎俩:

.... a.salesperson_id <> b.salesperson_id where cust_id="4"; 

但结果列出了所有的推销员。这很可能是由于这样的事实:在原来的查询所返回相同的推销员,也出售给其他客户

的3个表是这样的:

   Salesperson table 

        salesperson_ID,  Name,  Age,  Salary 

         1     Abe  61  140000 
         2     Bob  34  44000 
         5     Chris  34  40000 
         7     Dan  41  52000 
         8     Ken  57  115000 
         11     Joe  38  38000 


        Customer table 

        cust_ID,  Name,  City   Industry Type 

         4   faralon sacramento   H 
         6    Apple  cupertino   S 
         7   Honda  NY     B 
         9   Kolb  Oshkosh    B 




      Orders table 

      Number,  Order_date, cust_id, salesperson_id, Amount 

      10    8/2/1996   4    2   540 
      20    1/30/1999   4    8  1800 
      30    7/14/1995   9    1   460 
      40    1/29/1998   7    2  2400 
      50    2/3/1998   6    7  600 
      60    3/2/1998   6    7  720 
      70    5/6/1998   9    7  150 

任何帮助将不胜感激。 〜Alpinehyker

回答

2

你可以做这样的事情:

select a.name from salesperson a 
left join orders b on a.salesperson_id = b.salesperson_id and b.cust_id="4" 
where b.Number is null 

所以,让所有salepersons,left join订单客户4,并返回只有在有没有这样的命令行。

我假设NumberOrders或至少not null的主键。

+0

工作这两个答案!谢谢。 – alpinehyker

0

也许这将工作

SELECT 
    s.* 
FROM `Salesperson` AS s 
LEFT JOIN `Orders` AS o ON o.`salesperson_id` = s.`salesperson_ID` 
WHERE 
    o.`cust_id` NOT IN (4) 
GROUP BY s.`salesperson_ID`; 

回答你的第二个问题:

SELECT 
    COUNT(*) AS num_of_orders 
    ,s.`Name` 
FROM `Salesperson` AS s 
LEFT JOIN `Orders` AS o ON o.`salesperson_id` = s.`salesperson_ID` 
GROUP BY s.`salesperson_ID` 
HAVING num_of_orders >= 2; 

...和第3个问题。 (假设你有你的highAchiever表准备)

INSERT INTO `highAchiever` 
(`Name`,`Age`) 
SELECT 
    `Name` 
    ,`Age` 
FROM `Salesperson` 
WHERE 
    `Salary` >= 100000; 
+0

我不这么认为 - 这会给你所有不是顾客4的订单的销售人员 - 它只会排除只向顾客4销售(或根本不销售)的销售人员。此外,你会得到重复的行:每个订单一个,而不是每个销售人员。 – Blorgbeard

+0

这工作!谢谢。我有几个问题,我有困难。也许你可以帮助这些呢?问题2 ... 2.具有2个或更多订单的销售人员的姓名 3.编写SQL语句以将行插入名为highAchiever(Name,Age)的表中,其中销售人员必须具有100,000的工资或更大的被列入表中。非常感谢。 – alpinehyker

+0

我编辑了我原来的答案 –

0

所有的销售人员谁没有出售给CUSTOMER_ID 4:

SELECT s.Name FROM Salesperson AS s 
LEFT JOIN Orders AS o 
ON s.salesperson_ID = o.salesperson_ID 
WHERE o.customer_ID <> 4 
GROUP BY o.salesperson_ID;