假设我有一张年龄段的表格。
以下是年龄列表
我希望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’;
应该有效,但是只有一行代码可以显示它吗?
答案 0 :(得分:1)
这是GROUP BY
子句真正闪耀的实例:
SELECT age, COUNT(age)
FROM table_name
GROUP BY age
只是一个额外提示:
您不应在查询中使用单引号:
WHERE age = '1';
这是因为age
是INT
数据类型,因此没有单引号。 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
子句,该函数将应用于由from
和where
子句确定的整个数据集。例如,count
将计算结果集中的行数,而特定列上的sum
将对结果集中的所有行求和。
group by
子句允许我们做的是将from
和where
子句确定的结果集划分为分区,以便聚合函数不再适用于结果集作为一个整体,而是在结果集的每个分区内。
当您指定要分组的列时,您所说的是"对于结果集中列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;