在1 sql语句中多次计数

时间:2014-03-17 20:20:57

标签: mysql sql

假设我有一张年龄段的表格。

以下是年龄列表

  • 1
  • 2
  • 3
  • 1
  • 1
  • 3

我希望SQL计算1岁中的多少,2和3中的多少。

代码:

Select count(age) as age1 where age = ‘1’;
Select count(age) as age2 where age = ‘2’;
Select count(age) as age3 where age = ‘3’;

应该有效,但是只有一行代码可以显示它吗?

6 个答案:

答案 0 :(得分:1)

这是GROUP BY子句真正闪耀的实例:

SELECT age, COUNT(age)
FROM table_name
GROUP BY age

只是一个额外提示:

您不应在查询中使用单引号:

WHERE age = '1';

这是因为ageINT数据类型,因此没有单引号。 MySQL会隐式地将age转换为正确的数据类型 - 而且这里的开销可以忽略不计。但是想象一下,如果您正在使用两个包含数百万行的表JOIN,那么引入的开销将是需要考虑的事情。

答案 1 :(得分:0)

试试这个,如果计数限制为三个年龄,使用聚合函数而不对它们进行分组将产生一行,你可以使用SUM()条件,这将导致一个布尔值,你可以得到根据您的标准计算

Select SUM(age = '1') as age1,
SUM(age = '2') as age2,
SUM(age = '3') as age3
from table

答案 2 :(得分:0)

SELECT SUM(CASE WHEN age = 1 THEN 1 ELSE 0 END) AS age1,
       SUM(CASE WHEN age = 2 THEN 1 ELSE 0 END) AS age2,
       SUM(CASE WHEN age = 3 THEN 1 ELSE 0 END) AS age3
FROM YourTable

答案 3 :(得分:0)

select age, count(age) from SomeTable group by age

http://sqlfiddle.com/#!2/b40da/2

group by子句的工作原理如下:

使用聚合函数时,如count函数没有group by子句,该函数将应用于由fromwhere子句确定的整个数据集。例如,count将计算结果集中的行数,而特定列上的sum将对结果集中的所有行求和。

group by子句允许我们做的是将fromwhere子句确定的结果集划分为分区,以便聚合函数不再适用于结果集作为一个整体,而是在结果集的每个分区内。

当您指定要分组的列时,您所说的是"对于结果集中列x的每个不同值,创建一个分区,其中包含结果集中具有此特定值的任何行第x列"。然后,聚合函数不会产生覆盖整个结果集的一个结果,而是为结果集中列x的每个不同值产生一个结果。

使用您的示例输入:

1
2
3
1
1
3

让我们分析一下上面的问题。与往常一样,我们应该首先查看from子句和where子句。 from条款告诉我们,我们正在从SomeTable进行选择,只有这一点,并且缺少where条款告诉我们,我们正在从SomeTable的全部内容中进行选择。

接下来,我们将查看group by子句。它存在,并按age列分组,这是我们示例中的唯一列。 group by子句的存在完全改变了我们的数据集!我们现在从一组分区中选择一个分区,而不是从SomeTable的整个行集中进行选择,我们的原始结果集中的age - 列的每个不同值都是一个分区。 SomeTable)。

最后,我们将查看select - 条款。现在,由于我们从分区而不是常规行中进行选择,select - 子句可以包含的选项较少,实际上它只有2:它被分组的列,或者是一个聚合函数。

现在,在我们的示例中,我们只有一列,但考虑到我们有另一列,如下所示:

http://sqlfiddle.com/#!2/d5479/2

现在,想象一下,在我们的数据集中,我们有两行,都有age='1',但在另一列中有不同的值。如果我们要将这个其他列包含在按age - 列分组的查询中(我们现在知道它将为age - 列上的每个分区返回一行),那么该值应为在结果中呈现?包含除分组之外的其他列是没有意义的。 (我会在group by子句中留下多个列,根据我的经验,通常只需要一个......)

但回到我们的select - 子句,知道我们的数据集在{1, 2, 3} - 列中有不同的值age,我们应该在结果集中得到3行。要选择的第一件事是age - 列,它会生成值[1, 2, 3]´ in the three rows. Next in the选择-list is an aggregate function计数(年龄), which we now know will count the number of rows in each partition. So, for the row in the result where年龄=' 1&#39 ; , it will count the number of rows with年龄=' 1' , for the row where年龄=' 2' it will count the number of rows where年龄=' 2'`等等上。

结果看起来像这样:

age    count(age)
 1        3
 2        1
 3        2

(当然,您可以使用as - 运算符覆盖结果中第二列的名称。)

这就是今天的教训。

答案 4 :(得分:0)

如果您的查询只返回一列(在这种情况下为年龄,您可以使用Count + groupby):

SELECT age, Count(1) as qty
FROM [yourTable]
GROUP BY age

请记住,您必须按条件在组中添加任何其他列。

答案 5 :(得分:0)

Select age as Age_Group, count(age) as Total_count from table1 group by age;