这个数如何计算?

时间:2012-06-10 04:04:53

标签: sql-server-2008 count group-by

我的查询如下:

select     vend_id,
           COUNT(*) as num_prods
from       Products
group by   vend_id;

请告诉我这部分如何运作 - select vend_id, COUNT(vend_id)而不是select COUNT(vend_id)

4 个答案:

答案 0 :(得分:2)

select COUNT(vend_id)

这将返回供应商ID不为空的行数

select     vend_id, COUNT(*) as num_prods
from       Products
group by   vend_id

这将按Id分组元素,并为每个Id返回您有多少行。 一个例子:

ID          name       salary      start_date              city       region
----------- ---------- ----------- ----------------------- ---------- ------
          1 Jason            40420 1994-02-01 00:00:00.000 New York   W
          2 Robert           14420 1995-01-02 00:00:00.000 Vancouver  N
          3 Celia            24020 1996-12-03 00:00:00.000 Toronto    W
          4 Linda            40620 1997-11-04 00:00:00.000 New York   N
          5 David            80026 1998-10-05 00:00:00.000 Vancouver  W
          6 James            70060 1999-09-06 00:00:00.000 Toronto    N
          7 Alison           90620 2000-08-07 00:00:00.000 New York   W
          8 Chris            26020 2001-07-08 00:00:00.000 Vancouver  N

如果您运行此查询,您将获得城市的一行,并且您可以将一个函数(在本例中为count)应用于该行。因此,对于每个城市,您将获得行数。您还可以使用其他功能。

SELECT     City, COUNT(*) as Employees
FROM       Employee
GROUP BY   City

结果是:

City       Employees
---------  ---------
New York           3
Toronto            2
Vancouver          3

因为您可以比较每个城市的行数

答案 1 :(得分:0)

当您只选择COUNT(vend_id)没有GROUP BY子句时,您将得到一行,其中包含非NULL供应商ID的行总数 - 最后一位很重要,这也是您的一个原因可能更喜欢COUNT(*),以避免“丢失”行。有些人可能会说COUNT(*)在某种程度上效率较低,但在我使用过的DBMS中都是如此。在任何情况下,如果 使用脑死亡的DBMS,您可以随时尝试COUNT(1)

当您按vend_id分组时,每个供应商ID会获得一行,其中count是该ID的行数。

逐步详细说明(从概念上讲,虽然通过优化几乎可以肯定有效率),但第一个问题是:

SELECT COUNT(vend_id) AS num_prods FROM products
  • 获取products
  • 中所有行的列表
  • 计算vend_id不为NULL的行,然后在单个num_prods列中提供包含该计数的行。

对于分组:

SELECT vend_id, COUNT(vend_id) AS num_prods FROM products GROUP BY vend_id
  • 获取products
  • 中所有行的列表
  • 对于vend_id的每个值:
    • 计算与vend_id不匹配的vend_id匹配的行,然后在第一列中提供包含vend_id的一行,并在第二列num_prods列中提供该计数

请注意,那些空vend_id的行对聚合函数没有贡献(在这种情况下为count)。

在第一个查询中,这仅仅意味着它们不会出现在总计中。

在第二种情况下,这意味着输出行仍然存在,但计数将为零。这是使用COUNT(*)COUNT(1)的另一个好理由。

答案 2 :(得分:0)

select vend_id只会选择vend_id字段,其中select *会选择所有字段

答案 3 :(得分:0)

只要您使用select vend_id, COUNT(vend_id)

select COUNT(vend_id)group by vend_id就会为count列提供相同的结果。当您使用select vend_id, COUNT(vend_id)时,您必须使用vend_id

进行分组