1.数据表有两个字段 bus_id 和 record_id ,record_id 唯一不重复,bus_id 可以对应多个 record_id 。现求 record_id 的数量,多个 bus_id 对应的 recordId 算一个数量。 2.不能直接求去重后 bus_id 的数量,其他业务可能没有 bus_id
1.数据表有两个字段 bus_id 和 record_id ,record_id 唯一不重复,bus_id 可以对应多个 record_id 。现求 record_id 的数量,多个 bus_id 对应的 recordId 算一个数量。 2.不能直接求去重后 bus_id 的数量,其他业务可能没有 bus_id
|
cwccJan 5, 2022
1
1 我没太懂,record_id 都唯一不重复了,直接 count 应该就好?(或者你把唯一不重复的这个字段没设置成 primary ?那就不行)
终极解决:3NF |
|
XusuallyJan 5, 2022
2
最简单的 COUNT 满足不了么?还是我没理解需求?
|
|
sunhelterJan 5, 2022
3
不能直接去重就分别 union 咯
SQL Server 可以这么写: select SUM(ct) select COUNT(1) ct from table where ISNULL(bus_id,'')!='' group by bus_id union all select COUNT(1) from table where ISNULL(bus_id,'')='' |
|
sunhelterJan 5, 2022
4
上面的 SQL 在 SUM(ct)后加个括号,到结尾加反括号
|
|
5
@crazywhalecc 但是,如果一个 bus_id 对应多个 record_id,这种情况计数 record_id 只记一个,例如一个 bus_id 对应两个 record_id,count(record_id)时,只记一次。直接 count 会记录两次吧
|
|
zheng96Jan 5, 2022
6
前提是 bus_id 和 record_id 本身不会重复,如果会重复可以在 then 后头拼接个前缀区分下
select count( distinct( case when record_id is null then null when bus_id is null then record_id else bus_id end ) ) from table; |
|
7
@Xusually 要考虑 bus_id 对应多个 record_id 的情况,对应多个的话,record_id 只记录一次
|
|
8
@zheng96 谢谢大佬,貌似可以,我得多试一下
|
|
9
@sunhelter 感谢回复,mysql 好像不行
|
|
themostlazymanJan 5, 2022
10
问题描述没太懂,建议给一个最小化的表结构,再加几条典型数据来说明你的问题。
|
|
xiangyuecnJan 5, 2022
11
“不能直接求去重后 bus_id 的数量,其他业务可能没有 bus_id”
分两条简单的 sql 语句搞定,没必要写一条蹩脚的 sql |
|
JKeitaJan 5, 2022
12
同没看懂题目
|
|
newtype0092Jan 5, 2022
13
(select count(*) from table where bus_id is null) + (select count(*) from table where bus_is is not null group by bus_id)
|
|
zhuangjiaJan 5, 2022
14
题目中的描述部分 “多个 bus_id 对应的 recordId 算一个数量” 有歧义,楼主在 #7 给了补充描述:“bus_id 对应的 多个 recordId 算一个数量”。
|
|
ray5173Jan 5, 2022
15
select count(distinct a.record_id)
from a left join b on a.record_id = b.bus_id where b.bus_id is not null |
|
16
@fragrans23
//最小化表结构: CREATE TABLE `bus_test` ( `record_id` int(11) NOT NULL AUTO_INCREMENT, `bus_id` int(11) DEFAULT '0', PRIMARY KEY (`record_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; //测试数据 INSERT INTO `test`.`bus_test` (`bus_id`) VALUES (FLOOR(RAND() * 10)); //查询 SQL select sum(case when t.bus_id is null then t.record_count else 1 end) from (SELECT count(record_id) as record_count,bus_id FROM `bus_test` group by bus_id) t; |
|
17
@zhuangjia 感谢回复
|