背景信息:这是给一家假设的汽车租赁公司提供的。有两个与此问题有关的表格。它们被称为“职员表”和“销售职员表”。第一个表包含有关员工的信息,例如DOB等。第二个表包含以下信息:
Staff_ID =工作人员的唯一代码Sale_ID =特定销售的唯一代码SaleStaffMember_AssociatedWithPurchase =工作人员是否参与了首次销售或仅仅是退还汽车。
这两个表具有相同的Staff_ID。
我编写了以下SQL:
SELECT [staff table].staff_id as [Staff ID], Count([sale staff member table].staff_id) AS [Number of Rentals]
FROM [staff table]
LEFT JOIN [sale staff member table] ON [sale staff member table].staff_id = [staff table].staff_id
WHERE [sale staff member table].staff_id IS NULL or [sale staff member table].staff_id IS NOT NULL
GROUP BY [staff table].staff_id
它的作用是列出每个工作人员(一些工作人员未进行任何销售,因此不在销售工作人员表中),并在其旁边列出他们已完成的销售量:
我的问题是,此工作人员在技术上没有进行任何销售,但是当他应有0时,他被列为1。我理解为什么,因为我没有在SQL中编写与购买字段相关的任何内容。我尝试这样做,而我能得到的最大的就是从查询结果中完全删除该成员。但是,我想做的基本上是说:
“如果工作人员与购买无关,则不要在计数中包括此特定条目”
但是我不知道该怎么做。我尝试了一些荒谬的解决方案,并进行了查找,但最终找不到解决方案。我敢肯定它相对简单,但是过去几天我刚刚学习了SQL,所以我还不知道。
编辑:刚意识到我的where语句从字面上什么都不做哈哈,但这并不能解决任何问题,它只是使代码更整洁:
我修改后的代码:
SELECT [staff table].staff_id as [Staff ID], Count([sale staff member table].staff_id) AS [Number of Rentals]
FROM [staff table]
LEFT JOIN [sale staff member table] ON [sale staff member table].staff_id = [staff table].staff_id
GROUP BY [staff table].staff_id
谢谢!
编辑:最终答案
SELECT [Staff Table].Staff_ID AS [Staff ID], SSM.[Number of Rentals] AS [Number of Rentals]
FROM [staff table]
LEFT JOIN (SELECT Staff_ID, nz(COUNT(Staff_ID),0) as [Number of Rentals]
FROM [Sale Staff Member Table]
WHERE SaleStaffMember_AssociatedWithPurchase = 1
GROUP BY Staff_ID) AS SSM
ON [Staff Table].Staff_ID = SSM.Staff_ID
据我了解您的问题,如果您只是在寻找与购买相关的工作人员,则可以简单地执行以下查询:
SELECT s.staff_id AS [Staff Id], COALESCE(ssm.NoOfRentals,0) AS [Number of Rentals]
FROM [staff table] AS s
LEFT JOIN (SELECT staff_id, COUNT(staff_id) as NoOfRentals
FROM [sale staff member table]
WHERE SaleStaffMember_AssociatedWithPurchase = 1
GROUP BY staff_id) AS ssm
ON s.staff_id = ssm.staff_id
如果我错了,请纠正我。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句