0

我有一张桌子:

ID 帐户
1 22
1 22
2 44
3 22

如您所见,有很多重复项。我基本上需要编写一个执行两件事的查询:

  1. 将单独的 ID 与关联的帐户匹配 - 所以 1、3 是 22
  2. 计算它们链接的次数——所以在上面的例子中,两次。

编辑:

我想要的结果是 Account 22 与 ID 和这些 ID 列表链接的次数。

4

2 回答 2

2

测试:https ://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=6d84edba642dcb057441ea15540e8da4

如果您有一个可用的分析函数,则可以使用简单的分组,并使用分析 count() 计数

SELECT ID, Account, Count(ID) over (Partition by Account) as CNT
FROM OneTable
GROUP BY ID, Account
ORDER BY Account, ID

分析基本上说,对于每个帐户,返回不同 ID 的计数。外部 group by 返回 ID 和帐户的列表

所以结果看起来像:(假设我做对了)

ID  Account CNT
1   22      2
3   22      2
2   44      1


DDL Sample: SOURCE
SELECT ID, Account, Count(ID) over (Partition by Account) as CNT
FROM (Values (1 , 22),
(1, 22),
(2, 44),
(3, 22)) X (ID, Account)
GROUP BY ID, Account
ORDER BY Account, ID
于 2021-12-07T18:58:32.487 回答
1

这可以通过“group-by”、“count()”(聚合函数)、同一张表的“别名”和“子查询”来解决:

像这样的东西应该工作:

SELECT
  master.ACCOUNT,
  master.COUNT(*) as number
FROM
  table master
WHERE distinct ID in
(
   SELECT
     distinct ID
   FROM
     table t1,
     talbe t2
   WHERE
     t1.account = t2.account
)
GROUP-BY
  master.ACCOUNT 
;

SQL-结果:

帐户 数字
22 2
44 1

对于 ID,您必须使用与 Oracle“ListAGG”等效的东西——但这取决于您使用的数据库。→ 最好遵循以下说明:

SQLSERVER 中的 ListAGG

还要注意表中的重复项,通常应该避免这种情况→也许您有该表的自动增量主键(pk) - 如下所示:

PK ID 帐户
0001 01 22

如果您需要更新相同的 ID,请使用“MERGE”(更新或插入)-“合并”查询的语法还取决于使用的数据库(例如 Oracle SQL Server ...)。

于 2021-12-07T18:04:30.097 回答