繁体   English   中英

SQL查询计算多个列值的行

[英]SQL Query count rows where multiple column-values

所以这是我的 MySQL 表的样子(我有数千行):

| ID |         date        |   Color |   IUSERQ | 
|  1 | 2020-09-25 18:55:54 |    RED  |    GGW3  |
|  2 | 2020-09-25 18:24:12 |    RED  |    FFQ3  |
|  3 | 2020-09-24 17:32:52 |    RED  |    GWW3  |
|  4 | 2020-09-23 17:42:37 |   BLUE  |    JJN6  |
|  5 | 2020-09-23 17:33:55 |   BLUE  |    VVV5  |
|  6 | 2020-09-23 18:53:57 |    RED  |    FFQ3  |
|  7 | 2020-09-22 18:15:11 |   BLUE  |    FFQ3  |

现在要计算所有行并将它们按周分组,我这样做:

if($stmt = $link->query("SELECT WEEK(date),COUNT(*) FROM sales WHERE color='RED' AND YEAR(date) = YEAR(NOW()) GROUP BY WEEK(date) order by MONTH(date) ASC")){

$php_data_array = Array(); // create PHP array
while ($row = $stmt->fetch_row()) {
   $php_data_array[] = $row; // Adding to array
   }
}else{
echo $link->error;
}

echo json_encode($php_data_array); 

echo json_encode($php_data_array); ,它给出了当前输出: [["36","154"],["37","247"],["38","275"]] 所以数组 (36, 37, 38) 中的第一个字符串是周数,第二个是颜色为红色的行数。 现在,我还想在同一个数组中添加颜色为 BLUE 的位置,因此预期值应该类似于: [["36","154","166"],["37","247","265"],["38","275","298"]]

我应该使用什么方法来做到这一点?

只需添加另一列:

SELECT WEEK(date) as week, SUM(color = 'RED') as red, SUM(color = 'BLUE') as blue
FROM sales
WHERE color IN ('RED', 'BLUE') AND YEAR(date) = YEAR(NOW())
GROUP BY WEEK(date)
ORDER BY WEEK(date) ASC;

请注意对查询的更改:

  • SUM()对每种颜色进行条件聚合。
  • 列有名称,可用于在应用程序中引用它们。
  • ORDER BY由被聚合的列决定。

使用条件聚合:

select week(date) week_date, sum(color = 'RED') cnt_red, sum(color = 'BLUE') cnt_blue
from sales 
where color in ('RED', 'BLUE') and date >= date_format(current_date, '%Y-%m-01')
group by week(date) 
order by week_date

请注意,这对date列使用直接过滤,而不是在过滤列上应用函数。 这比year(date) = year(now())更有效,特别是如果您在该列上有索引。

我还更改了order by子句:显然,您希望按周而不是月进行排序(在大多数数据库中,这是一个编译错误,因为月不属于group by子句)。

您可以使用动态查询作为另一种选择:

SET @sql = NULL;

SELECT GROUP_CONCAT(
             DISTINCT
             CONCAT(
                    'SUM( color =''', color, ''' ) AS ',color
                    )
       )
  INTO @sql
  FROM sales s;

SET @sql = CONCAT('SELECT WEEK(date) AS WEEK,',@sql,
                   ' FROM sales
                    WHERE YEAR(date) = YEAR(NOW()) 
                    GROUP BY WEEK
                    ORDER BY WEEK'); 

然后从 php 代码块调用,例如:

if($stmt = $link->query( @sql )){ ....
$php_data_array = Array(); // create PHP array
....

这样,无需添加要单独分组的每个颜色名称,查询会透视表中存在的所有颜色列值。 可能会添加新颜色或删除现有颜色,而无需构建新查询。

Demo (为了显示查询结果)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM