我有一列名为“cardnum”,另一列名为 amount。 (实际上,表中还有多个其他字段,但我将坚持使用两个作为示例)
例如,
cardnum | 金额 |
---|---|
ABC123 | 50 |
ABC123 | 20 |
ABC123 | 30 |
ABC123 | 50 |
XYZ720 | 24 |
LFG475 | 35 |
LFG475 | 100 |
LFG475 | 0 |
ABC123 | 50 |
ABC123 | 20 |
是否有一个SQL语句返回一个新列,其中包含卡号列中每个卡号各自的计数?
它应该看起来像这样:
cardnum | 金额 | 数 |
---|---|---|
ABC123 | 50 | 6 |
ABC123 | 20 | 6 |
ABC123 | 30 | 6 |
ABC123 | 50 | 6 |
XYZ720 | 24 | 1 |
LFG475 | 35 | 3 |
LFG475 | 100 | 3 |
LFG475 | 0 | 3 |
ABC123 | 50 | 6 |
ABC123 | 20 | 6 |
我尝试了这样的方法(请记住,我将其应用于包含 17 列的整个表格):
SELECT card_number, COUNT(*) as frequency
FROM your_table_name
GROUP BY card_number;
我也尝试使用
COUNT(*) OVER(PARTITION BY...)
但它只返回整个新列的所有总行数。
但显然你不能将 groupby 与
*
一起使用,或者所有列都必须是 groupby
的一部分或包含在聚合函数中。
我们可以使用以下 SQL SERVER 查询来获取您想要的输出。
SELECT A.*, B.frequency FROM carddetails A
LEFT OUTER JOIN
(SELECT cardnum, COUNT(1) frequency FROM carddetails GROUP BY cardnum) B
ON A.cardnum=B.cardnum
我们正在使用 GROUP BY 和 COUNT 函数计算频率。 我们可以通过在原始表上应用 JOIN 与结果集来填充频率。
我们可以在DBFiddle上检查我的执行和输出。
注意:- 当我使用 INNER JOIN 时,它对 cardnum 上的输出进行排序。 LEFT OUTER JOIN 没有改变任何顺序。