如何为特定值添加计数列(如 sub-select)
How to add a counting column for specific values (as sub-select)
我有一个要添加列的查询。它应该包含特定列的值在 table.
中出现的次数
我目前的尝试
SELECT cleaning.*,
(SELECT COUNT(*)
FROM cleaning
WHERE column_b = cleaning.column_b)
AS multicleanamount
FROM cleaning
正在计算 每一行 因为它只是将一列与同一列进行比较 - 我理解原因。
所以当前(错误的)结果是
column_a
column_b
multicleanamount
12
300
7
13
321
7
14
300
7
15
330
7
16
330
7
17
351
7
18
330
7
我现在缺少的是如何告诉 sub-Select 从第一行开始与 cleaning.column_b
的当前值进行比较? (在cleaning.*
)
2bh 一开始我脑子里很容易,如果我将它与 '300'
这样的静态值进行比较,但 table 有 74 K 个条目。这必须是动态的。
我想要的输出是
column_a
column_b
multicleanamount
12
300
2
13
321
1
14
300
2
15
330
3
16
330
3
17
351
1
18
330
3
我希望这是可以理解的。如果不是请告诉我,我会尝试详细说明。
使用 table 别名,以便您可以区分子查询中的 cleaning
table 和主查询中的 table。在您的查询中,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
我有一个要添加列的查询。它应该包含特定列的值在 table.
中出现的次数我目前的尝试
SELECT cleaning.*,
(SELECT COUNT(*)
FROM cleaning
WHERE column_b = cleaning.column_b)
AS multicleanamount
FROM cleaning
正在计算 每一行 因为它只是将一列与同一列进行比较 - 我理解原因。 所以当前(错误的)结果是
column_a | column_b | multicleanamount |
---|---|---|
12 | 300 | 7 |
13 | 321 | 7 |
14 | 300 | 7 |
15 | 330 | 7 |
16 | 330 | 7 |
17 | 351 | 7 |
18 | 330 | 7 |
我现在缺少的是如何告诉 sub-Select 从第一行开始与 cleaning.column_b
的当前值进行比较? (在cleaning.*
)
2bh 一开始我脑子里很容易,如果我将它与 '300'
这样的静态值进行比较,但 table 有 74 K 个条目。这必须是动态的。
我想要的输出是
column_a | column_b | multicleanamount |
---|---|---|
12 | 300 | 2 |
13 | 321 | 1 |
14 | 300 | 2 |
15 | 330 | 3 |
16 | 330 | 3 |
17 | 351 | 1 |
18 | 330 | 3 |
我希望这是可以理解的。如果不是请告诉我,我会尝试详细说明。
使用 table 别名,以便您可以区分子查询中的 cleaning
table 和主查询中的 table。在您的查询中,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