【问题标题】:Count Distinct on multiple values within same column in SQL AggregationSQL聚合中同一列内的多个值的不同计数
【发布时间】: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()

标签: mysql sql count distinct aggregation


【解决方案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;

【讨论】:

    猜你喜欢
    • 2020-11-19
    • 2021-09-24
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多