sql - SQL 分组并同时计算 2 个不同的聚合函数
问题描述
这是我的桌子的样子:
VIDEO_ID DATETIME APPROVED VIOLATION_COUNT VIDEO_DESCRIPTION
VIDEO1 2018-01-02 yes 1 a
VIDEO2 2018-06-02 no 2 b
VIDEO3 2018-07-04 yes 1 c
VIDEO4 2018-01-12 yes 1 b
VIDEO5 2018-06-02 no 2 c
VIDEO6 2018-07-29 yes 1 a
我需要按 VIDEO_TYPE 对这个表进行分组(我由 VIDEO_DESCRIPTION 确定,这就是我使用 SWITCH - CASE 语句的原因,请参阅下面的查询)。然后,对于每个 VIDEO_TYPE,我需要计算 2 件事:
- VIOLATION_COUNT 和
- VIOLATION_COUNT 的总和,其中 APPROVED =“是”。
所以我希望我的查询返回 3 列:VIDEO_TYPE、 VIOLATION_COUNT 的总和和 VIOLATION_COUNT 的总和,其中每个VIDEO_TYPE的 APPROVED = 'yes'。
我的问题是如何计算 VIOLATION_COUNT 的总和和 VIOLATION_COUNT 的总和 where APPROVED = "yes" IN THE SAME TIME?
这是我的查询:
SELECT
CASE
WHEN VIDEO_DESCRIPTION = 'a' THEN 'Video type 1'
WHEN VIDEO_DESCRIPTION = 'b' THEN 'Video type 2'
WHEN VIDEO_DESCRIPTION = 'c' THEN 'Video type 3'
ELSE 'Others' END AS VIDEO_TYPE,
SUM(VIOLATION_COUNT) AS VIOLATION_COUNT,
(select count(APPROVED) where APPROVED = 'yes') AS TRUE_POSITIVE_VIOL_COUNT, -- THIS IS NOT WORKING
FROM my_table
GROUP BY
VIDEO_TYPE
这个查询给了我这个错误:
无效操作:子查询使用来自外部查询的未分组列“my_table.approved”;
解决方案
您可以添加一个 SUM(CASE) 来解决这个问题:
SELECT CASE WHEN VIDEO_DESCRIPTION = 'a' THEN 'Video type 1'
WHEN VIDEO_DESCRIPTION = 'b' THEN 'Video type 2'
WHEN VIDEO_DESCRIPTION = 'c' THEN 'Video type 3'
ELSE 'Others' END AS VIDEO_TYPE,
SUM(VIOLATION_COUNT) AS VIOLATION_COUNT,
SUM(CASE WHEN APPROVED = 'yes' THEN 1 ELSE 0 END) AS TRUE_POSITIVE_VIOL_COUNT
FROM tbl
GROUP BY VIDEO_DESCRIPTION;
视频类型 | VIOLATION_COUNT | TRUE_POSITIVE_VIOL_COUNT :----------- | --------------: | ----------------------: 视频类型 1 | 2 | 2 视频类型 2 | 3 | 1 视频类型 3 | 3 | 1
db<>在这里摆弄
推荐阅读
- python-3.x - Keras-Python 在 mnist 数据集上的验证集准确度低得令人难以置信
- php - 如何用 PHP 交换字符串中两个不同字符的值?A变成B,B变成A
- java - 来自 JSON 或 JSON-Schema 的普通旧 Java 对象
- java - 使用 Maven 构建在 src/main/resources 的子目录中包含资源
- ssis - CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER - 目标服务器连接
- javascript - Chrome 上区分大小写的锚点问题
- twig - 在 Twig 中获取子域
- c - 基于C中的1D数组索引提取3D数组
- c - C数组中的指针地址
- java - Android - ExoPlayer 在没有太多缓冲的情况下尽快开始播放