使用带有用户定义条件的 Count 从 sql 生成频率表

Posted

技术标签:

【中文标题】使用带有用户定义条件的 Count 从 sql 生成频率表【英文标题】:Generate frequency table from sql using Count with user defined condition 【发布时间】:2019-07-12 21:32:37 【问题描述】:

基本上我需要使用sql生成一个频率表,我有一个这样的示例表:

user_id   user_label     code1      date    
------   -----------    -----    ------  
1        x              a        01-01
1        x              a        01-01
1        x              a        01-02
1        x              b        01-01
1        x              c        01-02
1        y              a        01-01
2        x              a        01-01

计算出现次数的规则是如果两行有相同的user_id、user_label和date,那么重复的代码应该只计算一次。

例如,对于前两行,频率表应该是:

user_id      user_label   code1   count_code_1
--------     -----------  -----   ------------
1            x            a       1

因为即使 a 有两个实例,但它们发生在同一日期,所以应该只计算一次,我需要对 code_1 列中的每个唯一代码执行此操作 对于 user_id + user_label 的所有组合

处理完第三行,频率表应该是:

user_id      user_label   code_1   count_code_1
--------     -----------  ------   ------------
1            x            a        2

虽然是相同的代码('a'),但它发生在不同的日期(01-02) 最后,对于上面给出的示例表,期望的结果应该是

user_id      user_label   code_1   count_code_1
--------     -----------  ------   -------------
1            x            a        2
1            x            b        1
1            x            c        1
1            y            a        1
2            x            a        1 

到目前为止我所拥有的是

select t.user_id, t.user_label, t.code_1, count(###)
from t 
group by t.code_1,t.user_id, t.user_label 

问题是 1. 我不知道在 count 中放什么 2. 我不知道如何将日期条件合并到这个查询中。

任何建议,更正将不胜感激。

【问题讨论】:

【参考方案1】:

你似乎想要count(distinct date)

select t.user_id, t.user_label, t.code_1,
       count(distinct date)
from t 
group by t.code_1,t.user_id, t.user_label 

【讨论】:

以上是关于使用带有用户定义条件的 Count 从 sql 生成频率表的主要内容,如果未能解决你的问题,请参考以下文章

group by having用法举例

带有 WHERE 子句的 SQL COUNT

使用带有 WHERE 条件的单个查询 (SQL Express 2005) 从多个表中删除行

带有if条件的隐式布尔评估[重复]

带有条件的休眠查询

MyBatis 物理分页foreach 参数失效