mysql - 如何通过一条SQL实现该功能?

标签 mysql sql

我想得到结果:

name monthly_count total_count
a    10            20
b    15            25

关于monthly_count:

select name, count(*) as monthly_count from table_name where updated_at = yyyymm

关于total_count:

select count(*) as total_count from table_name

我想找到一种方法通过一条SQL来实现它,但我不知道该怎么做。

最佳答案

这是一种常见的方法:

SELECT t.name
     , COUNT(IF(t.updated_at = yyyymm, 1, NULL)) AS monthly_count
     , COUNT(1) AS total_count 
  FROM table_name t 
 GROUP
    BY t.name

获取monthly_count的技巧是使用一个表达式,当条件为真时返回非空值,当条件不为真时返回NULL。

使用 SUM 函数代替 COUNT 可以返回等效结果:

SELECT t.name
     , SUM(t.updated_at = yyyymm) AS monthly_count
     , SUM(1) AS total_count 
  FROM table_name t 
 GROUP
    BY t.name

跟进

您可以使用任何返回 1 或 0 的表达式。要检查多个条件,您可以使用 AND 和/或 OR 运算符

例如

SELECT t.name
     , SUM(t.updated_at = yyyymm AND t.flag='TRUE') AS monthly_true_count
     , SUM(t.flag='TRUE') AS total_true_count 
  FROM table_name t
 GROUP
    BY t.name

这是等效的简写:

SELECT t.name
     , SUM(IF( t.updated_at = yyyymm AND t.flag='TRUE', 1,0)) AS monthly_true_count
     , SUM(IF(t.flag='TRUE',1,0)) AS total_true_count 
  FROM table_name t
 GROUP
    BY t.name

关于mysql - 如何通过一条SQL实现该功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19872737/

相关文章:

mysql - 从 sql 中选择日期并将其格式化为文本

php - 如何处理 PHP 中 FluentPDO 的安全问题?

sql - 选择 COUNT(*) 和 DISTINCT

sql - 链接到用户个人资料的多张图片

MySQL GROUP_CONCAT DISTINCT 排序异常

mysql - 使用 java 和 junit 测试测试 mysql etl

PHP Reddit 排名算法 - 计算排名

sql - 将 HIVE 中的表从一个数据库复制到另一个数据库

mysql - SQL 语法错误 - Haversine 公式

html - 如果有 'Item Type' (Netsuite)