【问题标题】:Oracle SQL: Show Individual Count Even if There are DuplicatesOracle SQL:即使有重复也显示单个计数
【发布时间】:2016-06-10 16:17:06
【问题描述】:

这是我在这里的第一个问题,如果我违反任何规则,请原谅我。

这是我需要知道的:

如何创建一个 Oracle SQL 查询,即使结果中有重复项,它也会显示某项的唯一计数?

示例:customer 表包含不同客户的购买清单。该表列出了客户 ID、姓名、购买类别(即硬件、工具、季节性)等。查询的结果需要显示每个客户 ID、客户名称和购买类别,以及单个客户的数量。所以 John Smith 的客户 ID 1 已在每个部门进行了购买。如果我对客户进行计数,他会出现 3 次,因为他已经购买了 3 次,但我还需要一个列来仅计算一次客户。为其他部门返回的其他行中的计数应显示为 0 或 Null。

我通常通过提取所有内容并导出到 excel 来实现这一点。我在 ID 上添加了一个使用 IF 公式的列,仅在客户 IE 的第一次出现时显示 1:IF(A3=A2,0,1)(如果 a3 与 A2 相同,则显示 0,如果它与 A2 不同,然后显示 1)。这将为报告的一部分提供唯一的客户计数,并且仍会在报告的另一部分显示客户进行了多少购买。

我想直接在 SQL 查询中执行此操作,因为我需要处理大量数据,并且在 Excel 中添加任何公式都会使工作表变得很大。这也将更容易在 ACCESS 中托管查询结果,以便 excel 可以从那里提取它。

我已经尝试找到解决方案一段时间了,但是在 Google 上进行的任何搜索通常都会返回有关如何从表格中删除重复项或如何计算表格中的重复项的结果。

如果这是一个很长的问题,我很抱歉,但我想通过,所以我不会在第四个 cmets 上浪费任何人的时间(我在这里和其他地方看到过很多次,当 OP 提出一个非常神秘的问题时并希望每个人都能理解它们而无需进一步的赎罪)。

【问题讨论】:

  • edit 您的问题添加了一些示例数据和预期的输出。请格式化文本,no screen shots

标签: sql oracle duplicates


【解决方案1】:

在计数中使用 distinct 可以只计算一个字段的唯一值。

SELECT 
cust.customer_id, cust.customer_name, p.category,
count(distinct p.department_id) as total_departments,
count(*) as total_purchases
FROM customers cust 
LEFT JOIN purchase_table p on (cust.customer_id = p.customer_id)
GROUP BY cust.customer_id, cust.customer_name, p.category
ORDER BY cust.customer_id;

这种方法不限于 Oracle RDBMS。

【讨论】:

  • 感谢您的回答 Luk Storms。我尝试将 count(distinct c.customer_id) 放入当前查询中,但对于每个客户实例,它仍然显示 1。
  • 如果您在 customer_id 上执行此操作,同时在 customer_id 上分组,则预期为 1
  • 更改了查询。更接近您正在寻找的东西?
猜你喜欢
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多