【发布时间】:2014-03-15 21:33:13
【问题描述】:
我想在一行中检索并显示员工的销售额,然后是总销售额。
SELECT COUNT(SalesID) AS SalesForEmployee, COUNT(SalesID) AS TotalSales
FROM Sales
WHERE EmployeeID = 123
如何使 where 子句仅适用于 select 中的第一列?
【问题讨论】:
标签: sql sql-server count
我想在一行中检索并显示员工的销售额,然后是总销售额。
SELECT COUNT(SalesID) AS SalesForEmployee, COUNT(SalesID) AS TotalSales
FROM Sales
WHERE EmployeeID = 123
如何使 where 子句仅适用于 select 中的第一列?
【问题讨论】:
标签: sql sql-server count
SELECT
sum(case when EmployeeID = 123 then 1 else 0 end) AS SalesForEmployee
,COUNT(SalesID) AS TotalSales
FROM Sales
【讨论】:
select count(SalesEmp.SalesID) AS SalesForEmployee count(Sales.salesID) As TotalSales
from Sales left outer join Sales as SalesEmp
on Sales.salesID=SalesEmp.SalesID
and SalesEmp.EmployeeID = 123
【讨论】:
您不能拥有仅适用于一列的where。
为了在只扫描表一次的同时获得两个计数,您可以这样做:
select
sum(case when EmployeeID=123 then 1 else 0 end) as SalesForEmployee,
Count(SalesID) as TotalSales
from Sales
没有where 子句,因为Count(SalesID) 需要计算每一行才能得到总计数。
由于您必须查看每一行,case when EmployeeID=123 then 1 else 0 end 为属于目标员工的每一行提供 1,为不属于目标员工的每一行提供 0。因此,对该表达式求和只会为您提供该员工的计数。
SalesID EmployeeID (case when ... )
1 123 1
2 311 0
3 333 0
4 123 1
5 300 0
count = 5 sum = 2
你也可以这样做:
select
(select count(SalesID) from Sales where EmployeeID=123) as SalesForEmployee,
(select count(SalesID) from Sales) as TotalSales
但是现在你要扫描Sales 表两次,会比较慢。
【讨论】:
这是一种将两个选择语句合二为一的嵌套子查询方法。
SELECT
(SELECT COUNT(SalesID) FROM Sales WHERE EmployeeID = 123) AS SalesForEmployee,
(SELECT COUNT(SalesID) FROM Sales) AS TotalSales
另一种写法是这样的。
SELECT COUNT(SalesID) AS SalesForEmployee,
(SELECT COUNT(SalesID) FROM Sales) AS TotalSales
FROM Sales WHERE EmployeeID = 123
使用相关子查询,您可以将外部查询与内部查询链接起来。假设您想获得不包括 EmployeeID 123 的销售额的总销售额
SELECT COUNT(SalesEmployee.SalesID) AS SalesForEmployee,
(SELECT COUNT(SalesID) FROM Sales WHERE Sales.EmplyeeID <> SalesEmployee.EmployeeID) AS TotalSales
FROM Sales As SalesEmployee WHERE SalesEmployee.EmployeeID = 123
这里的内部查询引用了 WHERE 子句中的外查询 EmployeeeID 以将它们过滤掉。
【讨论】: