SQL聚合中同一列内的多个值的不同计数

Posted

技术标签:

【中文标题】SQL聚合中同一列内的多个值的不同计数【英文标题】:Count Distinct on multiple values within same column in SQL Aggregation 【发布时间】:2021-05-17 17:20:35 【问题描述】:

目标:

我想显示所选组合的不同 ID 的数量。

在下面的示例中,我有粒度级别的数据:ID 级别数据。

我想显示每个组合的不同 ID 的数量。

为此,我使用 count distinct 这将为以下组合提供“1”。

但是假设我想找到同时进行电子商务和面对面交易的 ID 数量,在这种情况下,如果我只使用这些数据,我将显示 E-comm 和 Face 的总和面对,结果将是“2”而不是“1”。

而且这不仅限于 Ecom/Face to face。我想对所有列应用相同的逻辑。

如果您有任何其他替代方法来解决此问题,请告诉我。

【问题讨论】:

您的问题中没有链接。 您能否提供示例数据和所需的输出 嘿抱歉刚刚添加了链接。请检查 很难理解你在寻找什么。请将示例数据以 DDL+DML 格式或带有所需结果的长边格式的文本发布。不确定,但看起来您正在寻找条件聚合 SUM() 而不是 COUNT() 欢迎来到 SO。请看Why should I provide an MCRE for what seems to me to be a very simple SQL query 【参考方案1】:

首先在您的表中聚合以获得每个 TranType 的不同 ids:

SELECT TranType, COUNT(DISTINCT id) counter_distinct
FROM tablename
GROUP BY TranType

然后加入表:

SELECT t.*, g.counter_distinct
FROM tablename t 
INNER JOIN (
  SELECT TranType, COUNT(DISTINCT id) counter_distinct
  FROM tablename
  GROUP BY TranType
) g ON g.TranType = t.TranType

或使用相关子查询:

SELECT t1.*, 
       (SELECT COUNT(DISTINCT t2.id) FROM tablename t2 WHERE t2.TranType = t1.TranType) counter_distinct
FROM tablename t1

【讨论】:

您好,感谢您的解决方案。但在这里我想对 ID 做一个不同的计数,而不是输入 @kiva 我误读了要求。请参阅我编辑的答案。 我没听懂这个查询。所以根据这个查询,我会得到所有行的不同计数为 '2' 对吗? @kiva 对于您的示例数据,是的,您将得到 2。【参考方案2】:

但是假设我想找出同时进行电子商务和面对面交易的 ID 数量,在

您可以使用以下方法获取 id 列表:

select id
from t
where tran_type in ('Ecomm', 'Face to face')
group by id
having count(distinct tran_type) = 2;

您可以使用子查询获取计数:

select count(*)
from (select id
      from t
      where tran_type in ('Ecomm', 'Face to face')
      group by id
      having count(distinct tran_type) = 2
     ) i;

【讨论】:

以上是关于SQL聚合中同一列内的多个值的不同计数的主要内容,如果未能解决你的问题,请参考以下文章

拆分python中不同列中列内的字典列表

fread指定列内的分隔符

将多个列变为函数会为dplyr中的结果列内的每个组件创建一个列表

使用引导程序使每列内的元素具有相同的高度

数据表列内的 MySQL 循环

scala spark 使用 expr 在列内赋值