【问题标题】:Select multiple value [duplicate]选择多个值[重复]
【发布时间】:2021-01-11 06:48:38
【问题描述】:

我有一串值,例如 '409.7,409,334.2' ;元素的数量不同。 我喜欢计算 409.7 有多少条记录 + 409 有多少条记录 + 334.2 有多少条记录 像什么?

SELECT COUNT "PrimaryKey" 
FROM Data 
WHERE "Program Number" IN '409.7,409,334.2' AND "Date" >=  1/1/2020

【问题讨论】:

  • 字符串从何而来?难道你不能在创建 SQL 之前把它分开吗?
  • 您需要对每个节目编号进行单独计数,还是只计算所有节目编号的总数?
  • 我可以重新格式化说..列表中的字符串
  • WHERE FIND_IN_SET(`Program Number`, '409.7,409,334.2')
  • 只是总数

标签: mysql sql csv count where-clause


【解决方案1】:

如果你只想要总数,你可以使用find_in_set()和聚合:

select count(*) cnt
from data
where find_in_set(program_number, '409.7,409,334.2')

如果您想要每个元素的计数,那么一种选择是条件聚合:

select 
    sum(find_in_set(program_number, '409.7,409,334.2') = 1) cnt1,
    sum(find_in_set(program_number, '409.7,409,334.2') = 2) cnt2,
    sum(find_in_set(program_number, '409.7,409,334.2') = 3) cnt3
from data
where find_in_set(program_number, '409.7,409,334.2')

如果 csv 列表中有很多元素,则最好生成行而不是列。这为您提供了每个元素 index 的匹配计数:

select find_in_set(program_number, '409.7,409,334.2') element_index, count(*) cnt
from data
group by element_index 

【讨论】:

  • 我不认为program_number 是一个逗号分隔的列表,只是这个文字字符串。
  • @Barmar:是的,我假设它是一个 csv 字符串,如 OP 所示:'409.7,409,334.2'
  • 我不知道列表中会有多少元素。大概十几个
  • 你似乎把它弄反了。 Program Number 是单个数字,他想检查它是否在逗号分隔的列表中。
  • @Barmar:啊,是的,我明白你的意思了,谢谢。我改变了答案。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 2015-01-10
  • 2019-07-18
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
相关资源
最近更新 更多