[英]How to add a counting column for specific values (as sub-select)
我有一个要向其中添加列的查询。 它应该包含特定列的值在该表中出现的次数。
我目前的尝试
SELECT cleaning.*,
(SELECT COUNT(*)
FROM cleaning
WHERE column_b = cleaning.column_b)
AS multicleanamount
FROM cleaning
正在计算每一行,因为它只是将一列与同一列进行比较 - 我理解原因。 所以当前(错误)的结果是
列_a | 列_b | 多清洁量 |
---|---|---|
12 | 300 | 7 |
13 | 321 | 7 |
14 | 300 | 7 |
15 | 330 | 7 |
16 | 330 | 7 |
17 | 351 | 7 |
18 | 330 | 7 |
我现在缺少的是如何告诉子选择与第一行中的cleaning.column_b
的当前值进行比较? (这是在cleaning.*
)
2bh 起初在我的脑海中很容易,如果我将它与像'300'
这样的静态值进行比较,但该表有 74 K 个条目也是如此。 这必须是动态的。
我想要的输出是
列_a | 列_b | 多清洁量 |
---|---|---|
12 | 300 | 2 |
13 | 321 | 1 |
14 | 300 | 2 |
15 | 330 | 3 |
16 | 330 | 3 |
17 | 351 | 1 |
18 | 330 | 3 |
我希望这是可以理解的。 如果不是,请告诉我,我会尝试指定更多。
使用表别名,以便您可以将子查询中的cleaning
表与主查询中的表区分开来。 在您的查询中, WHERE column_b = cleaning.column_b
正在将列与其自身进行比较,因此条件始终为真并且您正在计算所有行。
SELECT c1.*,
(SELECT COUNT(*)
FROM cleaning AS c2
WHERE c1.column_b = c2.column_b)
AS multicleanamount
FROM cleaning AS c1
将其编写为JOIN
而不是相关子查询也可能更好:
SELECT c1.*, c2.multicleanamount
FROM cleaning AS c1
JOIN (
SELECT column_b, COUNT(*) AS multicleanamount
FROM cleaning
GROUP BY column_b
) AS c2 ON c1.column_b = c2.column_b
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.