我正在用MySQL练习SQL,在SQL中遇到了一个奇怪的行为.假设我有一张这样的桌子:

Delivery table:
+-------------+-------------+------------+-----------------------------+
| delivery_id | customer_id | order_date | customer_pref_delivery_date |
+-------------+-------------+------------+-----------------------------+
| 1           | 1           | 2019-08-01 | 2019-08-02                  |
| 2           | 5           | 2019-08-02 | 2019-08-02                  |
| 3           | 1           | 2019-08-11 | 2019-08-11                  |
| 4           | 3           | 2019-08-24 | 2019-08-26                  |
| 5           | 4           | 2019-08-21 | 2019-08-22                  |
| 6           | 2           | 2019-08-11 | 2019-08-13                  |
+-------------+-------------+------------+-----------------------------+

我的问题是:

SELECT COUNT(*) as imm, count(*) over() as all_t 
FROM 
Delivery
WHERE order_date = customer_pref_delivery_date 

结果:

+-----+-------+
| imm | all_t |
+-----+-------+
| 2   | 1     |
+-----+-------+

我希望over()函数将覆盖整个表,在本例中返回6,但出于某种原因,它只返回1.这种行为有什么解释吗?

推荐答案

窗口功能:

count(*) over() as all_t

对查询结果进行操作:

SELECT COUNT(*) as imm  
FROM Delivery
WHERE order_date = customer_pref_delivery_date 

which is only 1 row (with 1 column) and this is why you get 1 as result.

我相信你想要的是条件聚合:

SELECT COUNT(CASE WHEN order_date = customer_pref_delivery_date THEN 1 END) AS imm, 
       COUNT(*) AS all_t -- here it's the aggregate function COUNT()
FROM Delivery;

See the demo.

Mysql相关问答推荐

S优化联接更新的最佳方式是什么?

Google Sheet查询以提取数据并用值替换复选框.(差异)

版本升级到5.0.0后在QueryDSL中使用Enum时出错

如何查询一行

我是否需要在 N+1 列上建立索引,才能有效地在 N 列上执行 SELECT,并按其他列排序?

在 .NET 6 中使用 Dapper Framework 未能成功连接到 MySql

使用 presto 或 mysql 添加每个组中的缺失值

SQL:如何为给定组中的所有记录 Select 一列与另一列不匹配的位置

使用sql查找源和最终目的地

在 SQL 中 for each 组返回具有最大值的行,包括具有相同值的行

MySQL如何在小时和分钟之间 Select 时间

如何使用 SQL 聚合和求和相似 Select 的值?

如何在 MYSQL 中使用多个表进行插值

MySQL在定义表的位置后抛出错误

如何在考虑另一表的值的情况下计算一列的值

Mysql insert with loop out of select 语句

如何删除没有临时表的 MySQL 表中的所有重复记录

从mysql中的大表中快速 Select 随机行

MySQL - 错误 1045 - 访问被拒绝

如何使用 Java 更改数据库连接中的 MySQL 时区?