【问题标题】:How to use count "how many times a particular customer made inquiries"?如何使用计数“特定客户进行了多少次查询”?
【发布时间】:2021-01-28 12:46:49
【问题描述】:

我有这张桌子叫做“Anfrage”。这些是“Anfrage Table”中的列:

Anfrage Table

我想计算同一个客户查询了多少次。所以我做了一个新的专栏“Menge_Anfrage”,意思是查询的数量。结果应该是这样的:

Table Result

我尝试使用这个查询:

 `SELECT DISTINCT Count(*)
FROM Anfrage
WHERE KundenNr = 1
) AS "Menge Anfrage",`

但它在“Menge Anfrage”列的所有行中返回“4”。有人可以告诉我正确的查询吗?我正在使用 SQL 工具 1,8 b38。非常感谢。

【问题讨论】:

  • 有点困惑。你有一个子句WHERE KundenNr = 1 但你的表没有这样的行?
  • 我只是随机尝试查询。如果我没有放 where 子句,它会返回一个“6”作为结果,这不是我想要的。你看到我的表格结果了吗?这就是我想要的。
  • 我知道了,我相信你现在已经有了答案:)

标签: sql oracle count distinct-values


【解决方案1】:

您似乎想计算 KundenNr 出现的次数。您的表不需要为此添加新列;你应该在每次查询中计算它:

SELECT
  KundenNr,
  Project,
  COUNT(*) OVER(PARTITION BY KundenNr) as Menge_Anfrage
FROM
  Anfrage

上面的查询相当于这个查询,适用于不支持分析功能的数据库:

SELECT
  a.KundenNr,
  a.Project,
  x.Menge_Anfrage
FROM
  Anfrage a
  INNER JOIN (SELECT KundenNr, COUNT(*) as Menge_Anfrage FROM Anfrage GROUP  BY KundenNr) x 
  ON a.KundenNr = x.KundenNr

OVER(PARTITION BY KundenNr) 与底部查询的 GROUP BY 子查询的作用差不多;它根据 KundenNr 的不同值将数据集分成多个分区(组),并且 COUNT(*) 适用于分区,而不是整个数据集。研究并理解底部查询是如何工作的,然后如果您记住分区 kundennr 和表中的行之间的连接是自动的,那么您应该能够理解顶部查询。

这是写同一件事的另一种方式:

SELECT
  a.KundenNr,
  a.Project,
  (SELECT COUNT(*) FROM Anfrage x WHERE x.KundenNr = a.KundenNr) as Menge_Anfrage
FROM
  Anfrage a

您可以认为 oracle 将为输出中的每一行运行 select 中显示的子查询。这在逻辑上相当于运行一个分组查询,然后加入结果,或者创建一个将 KundenNr 映射到 Count 的分区哈希表,然后在准备结果时将它们匹配起来

【讨论】:

  • 是的,你明白我的意思。但不幸的是,您的查询没有成功。它给出了错误 ORA-01427:子查询返回多于一行 :(
  • 这不是我的查询给出的,而是你用它做的任何事情。例如,如果您在 INSERT INTO table (a,b) SELECT a,b,c FROM othertable 之类的插入中使用它 - 此查询选择 3 个值,但插入仅指定 2; “太多值”错误结果。正如我回答的第一行所述,您不应将此计数存储在表中,因为每次添加行时都必须更新它。只需在需要时通过运行此查询来计算它(在您想要最新计数的任何时候使用这个额外的COUNT(*) OVER(...)
  • @ella widya,不要在某处替换查询,因为您可能已经完成了似乎给出的内容,但将此作为最终解决方案。
  • @Caius Jard 我没有使用任何插入,现在它返回错误 ORA-01427:子查询返回多于一行。这个“OVER(PARTITION BY KundenNr)”有什么作用?
  • 我的第一个查询不使用子查询。我的第二个查询有一个连接的子查询,这样的查询返回多行是完全合法的。 您正在使用答案中给出的查询做其他事情,而您做错了。 “子查询返回多于一行”出现在像 SELECT * FROM table WHERE x = (SELECT y FROM othertable) 这样的查询上,其中子查询 SELECT y FROM othertable 返回多于一行。 x 不能同时等于多个值
猜你喜欢
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
相关资源
最近更新 更多