问题描述
我有一张名为“ Anfrage”的表。这些是“ Anfrage表”中的列:
我想计算一下同一位顾客进行咨询的次数。因此,我创建了一个新列“ Menge_Anfrage”,该列表示查询数量。结果应该是这样的:
我尝试使用此查询:
`SELECT disTINCT Count(*)
FROM Anfrage
WHERE KundenNr = 1
) AS "Menge Anfrage",`
,但在“ Menge Anfrage”列中的所有行中返回“ 4”。有人可以告诉我正确的查询吗?我正在使用sql工具1,8 b38。非常感谢。
解决方法
您似乎想计算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,(SELECT COUNT(*) FROM Anfrage x WHERE x.KundenNr = a.KundenNr) as Menge_Anfrage
FROM
Anfrage a
您可以认为oracle将对输出中的每一行运行select中显示的子查询。从逻辑上讲,这等效于运行分组查询,然后联接结果,或创建将KundenNr映射为Count的分区哈希表,然后在准备结果时将它们进行匹配