【问题标题】:Multiple counts with different conditions不同条件下的多次计数
【发布时间】: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


    【解决方案1】:
    SELECT 
      sum(case when EmployeeID = 123 then 1 else 0 end) AS SalesForEmployee
     ,COUNT(SalesID) AS TotalSales
    FROM Sales
    

    【讨论】:

    • Blorgbeard 在几秒钟内领先于我 :-)
    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

      您不能拥有仅适用于一列的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 表两次,会比较慢。

      【讨论】:

      • 成功了,谢谢!虽然我不太确定它为什么会起作用。我真的不明白你为什么需要一个总和和案例?
      • 我扩展了我的答案,希望对您有所帮助。
      • 太好了,非常感谢!我现在明白了:)
      【解决方案4】:

      这是一种将两个选择语句合二为一的嵌套子查询方法。

      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 以将它们过滤掉。

      【讨论】:

      • 请解释清楚你的答案
      猜你喜欢
      • 2021-11-20
      • 2019-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 1970-01-01
      • 2022-09-22
      • 2014-04-02
      相关资源
      最近更新 更多