SQL提问!求帮助,急!

  • 需要按照不同count的数量(三个 四个或五个+)来展示结果

  • 每个count的数量有对应的其他数值(a,b,c,d)

  • 需要在特定时间段内找出最高的数值(max abcd)

  • 求私!


<select id="queryEventQuantity" resultType="com.jdl.lomir.chint.domain.entity.LomirChintEventInfoQuantity">
        SELECT
        COUNT(*) allQuantity,
        COUNT(case when e.status='CONFIRM' then 1 END ) confirmQuantity,
        COUNT(case when e.status='UNTREATED' then 1 END ) untreatedQuantity,
        COUNT(case when e.status='INVALID' then 1 END ) invalidQuantity,
        <choose>
            <when test="status!=null">
                COUNT(case when e.status=#{status.name} then 1 END ) eventTypeQuantity,
                COUNT(case when e.event_type='COLLISION' and e.status=#{status.name} then 1 END ) collisionQuantity,
                COUNT(case when e.event_type='OVERSPEED' and e.status=#{status.name} then 1 END ) overspeedQuantity,
                COUNT(case when e.event_type='HUMIDITY_EXCEEDED' and e.status=#{status.name} then 1 END ) humidityQuantity,
                COUNT(case when e.event_type='COST' and e.status=#{status.name} then 1 END ) costQuantity,
                COUNT(case when e.event_type='DAMAGE' and e.status=#{status.name} then 1 END ) damageQuantity,
                COUNT(case when e.event_type='DELAY' and e.status=#{status.name} then 1 END ) delayQuantity
            </when>
            <otherwise>
                COUNT(e.event_type) eventTypeQuantity,
                COUNT(case when e.event_type='COLLISION' then 1 END ) collisionQuantity,
                COUNT(case when e.event_type='OVERSPEED' then 1 END ) overspeedQuantity,
                COUNT(case when e.event_type='HUMIDITY_EXCEEDED' then 1 END ) humidityQuantity,
                COUNT(case when e.event_type='COST' then 1 END ) costQuantity,
                COUNT(case when e.event_type='DAMAGE' then 1 END ) damageQuantity,
                COUNT(case when e.event_type='DELAY' then 1 END ) delayQuantity
            </otherwise>
        </choose>
        FROM lomir_chint_event_info e
      
    </select>

给一些示例会好理解一些,你说的还是抽象的东西。
1、根据类型对数据进行分组group by
2、用case when then 对查询的结果进行分类
3、条件处理

可以将具体的场景和问题描述出来,可以做的

没有具体的场景没法弄,看描述应该是先分组进行计算

大概明白题主的意思,就是搞个嵌套组合SQL语句查询出来最大的count数量然后展现出来

补充:题主,你把你的需求详细描述一下

把需求描述清楚了,应该挺简单的

SELECT COUNT(*) allQuantity, COUNT(case when e.status='CONFIRM' then 1 END ) confirmQuantity, COUNT(case when e.status='UNTREATED' then 1 END ) untreatedQuantity, COUNT(case when e.status='INVALID' then 1 END ) invalidQuantity, COUNT(case when e.status=#{status.name} then 1 END ) eventTypeQuantity, COUNT(case when e.event_type='COLLISION' and e.status=#{status.name} then 1 END ) collisionQuantity, COUNT(case when e.event_type='OVERSPEED' and e.status=#{status.name} then 1 END ) overspeedQuantity, COUNT(case when e.event_type='HUMIDITY_EXCEEDED' and e.status=#{status.name} then 1 END ) humidityQuantity, COUNT(case when e.event_type='COST' and e.status=#{status.name} then 1 END ) costQuantity, COUNT(case when e.event_type='DAMAGE' and e.status=#{status.name} then 1 END ) damageQuantity, COUNT(case when e.event_type='DELAY' and e.status=#{status.name} then 1 END ) delayQuantity COUNT(e.event_type) eventTypeQuantity, COUNT(case when e.event_type='COLLISION' then 1 END ) collisionQuantity, COUNT(case when e.event_type='OVERSPEED' then 1 END ) overspeedQuantity, COUNT(case when e.event_type='HUMIDITY_EXCEEDED' then 1 END ) humidityQuantity, COUNT(case when e.event_type='COST' then 1 END ) costQuantity, COUNT(case when e.event_type='DAMAGE' then 1 END ) damageQuantity, COUNT(case when e.event_type='DELAY' then 1 END ) delayQuantity FROM lomir_chint_event_info e e.is_delete=0 =#{beginTime}]]>

我来回答吧。 假设我们有这样一个场景,每个接口执行的时候都会记录下接口编号,接口名称,执行时间。 在一定时间内,接口执行次数小于等于1 对服务器压力是60 , 接口执行次数小于等于3 对服务器压力是80, 接口执行次数小于等于4 对服务器压力是90 。
表语句:

DROP TABLE IF EXISTS `execut_log`;
CREATE TABLE `execut_log`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',
  `interface_id` bigint(20) DEFAULT NULL COMMENT '接口编号',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '接口名称',
  `execut_time` datetime(0) DEFAULT NULL COMMENT '接口执行时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of execut_log
-- ----------------------------
INSERT INTO `execut_log` VALUES (1, 1, '商品上架', '2022-08-01 14:29:04');
INSERT INTO `execut_log` VALUES (2, 2, '下订单', '2022-08-01 14:29:17');
INSERT INTO `execut_log` VALUES (3, 2, '下订单', '2022-08-01 14:30:31');
INSERT INTO `execut_log` VALUES (4, 1, '商品上架', '2022-08-01 14:30:44');
INSERT INTO `execut_log` VALUES (5, 3, '商品同步', '2022-08-01 14:31:27');
INSERT INTO `execut_log` VALUES (6, 2, '下订单', '2022-08-01 14:32:06');
INSERT INTO `execut_log` VALUES (7, 2, '下订单', '2022-08-01 14:32:15');
INSERT INTO `execut_log` VALUES (8, 1, '商品上架', '2022-08-01 14:32:23');

SET FOREIGN_KEY_CHECKS = 1;

要求:

需要按照不同count的数量(三个 四个或五个+)来展示结果

每个count的数量有对应的其他数值(a,b,c,d)

语句:

SELECT 
  CASE
    WHEN num <= 1 THEN 60 
    WHEN num <= 3 THEN 80
    WHEN num <= 4 THEN 90 
    ELSE 0
  END AS level,interface_id,name, num
    from 
(select  interface_id,name, count(*) num from execut_log where execut_time BETWEEN '2022/07/31' and '2022/08/02'
GROUP BY interface_id,name ) b
ORDER BY b.num DESC;

需要在特定时间段内找出最高的数值(max abcd)
特定时间段我是看明白了,最高数值 (max abcd) 不是很明白。 我猜测你想要的是 a b c d 中最大的那一个。
语句如下

select interface_id,name, MAX(level)   from (
SELECT 
  CASE
    WHEN num <= 1 THEN 60 
    WHEN num <= 3 THEN 80
    WHEN num <= 4 THEN 90 
    ELSE 0
  END AS level,interface_id,name, num
    from 
(select  interface_id,name, count(*) num from execut_log where execut_time BETWEEN '2022/07/31' and '2022/08/02'
GROUP BY interface_id,name ) b
ORDER BY b.num DESC
) t   GROUP BY interface_id,name   ORDER BY LEVEL desc LIMIT 1

如果最后一问不是你想要的,你再描述下,我在追答。



 其实有count很难实现

可以用sum 去实现它

例子如下

  select xy, sum(case when jw_cljgh=1 then 1 else 0 end) as 留级,sum(case when jw_cljgh=2 then 1 else 0 end) as 复学 from xjgl,bjsjk where xjgl.bh=bjsjk.bh group by xy

可以参考下这篇文章:https://blog.csdn.net/qq_34972627/article/details/123051450

这类求值用窗口函数最为实用简单,row_number()

需要按照不同count的数量(三个 四个或五个+) 这块没太明白、有具体的数据吗?

萝asdf答得很详细了

有一堆数据,需要统计
有一些统计好的数据,找出对应的对象,
在特定时间段内,给出最大count值和对象。