【问题标题】:Find the count of shared account查找共享帐户的计数
【发布时间】:2021-06-08 20:22:48
【问题描述】:

我在下面有一张名为acc_table的表格:

name account_id
john 1234
john 5678
lisa 1234
lisa 3345

我想编写一个 SQL 查询来生成下表,以查找共享帐户的数量和相应的帐户所有者:

person_1 person_2 count_of_shared_account
john lisa 1

我最接近的方法是:

SELECT a1.name AS person_1, a2.name AS person_2, COUNT(a1.account_id) AS count_of_shared_account
FROM acc_table a1
JOIN acc_table a2
ON a1.account_id = a2.account_id
AND a1.name != a2.name
GROUP BY 1,2

我得到的结果是:

person_1 person_2 count_of_shared_account
john lisa 1
lisa john 1

第二行是第一行的重复结果,我不希望这样。

解决这个问题并得到我们想要的表的正确方法是什么?提前致谢!

【问题讨论】:

  • 如果有四分之一等三分之一的人共享一个 account_id,您期望什么?

标签: mysql sql


【解决方案1】:

您可以通过更改将其限制为每个元组一行

AND a1.name != a2.name

AND a1.name < a2.name

所以当你有Lisa,JohnJohn,Lisa 对应a1.Name,a2.Name 时,Lisa,John 将被排除在外,因为Lisa &gt; John

完整查询

SELECT a1.name AS person_1, a2.name AS person_2, COUNT(a1.account_id) AS count_of_shared_account
FROM acc_table a1
JOIN acc_table a2
ON a1.account_id = a2.account_id
AND a1.name < a2.name
GROUP BY a1.name, a2.name;

Example on SQL Fiddle

如果您有多个人共享一个帐户,您将为每个元组获得一行,例如如果您有 3 个人(Lisa、John 和 Steve),您将获得 3 行:

person_1 person_2 count_of_shared_account
john lisa 1
john Steve 1
lisa Steve 1

【讨论】:

    【解决方案2】:

    你可以这样考虑:

    元数据创建:

    Create table acc_table(name varchar(20), account_id int);
    Insert into acc_table values('John',123);
    Insert into acc_table values('Lisa',123);
    Insert into acc_table values('Tiger',567);
    Insert into acc_table values('Lisa',567);
    Insert into acc_table values('Lisa',890);
    Insert into acc_table values('Tiger',890);
    Insert into acc_table values('max',111);
    Insert into acc_table values('lucy',222);
    Insert into acc_table values('monica',222);
    Insert into acc_table values('Jenifer',222);
    Insert into acc_table values('lucy',333);
    Insert into acc_table values('monica',333);
    Insert into acc_table values('Jenifer',333);
    Insert into acc_table values('lucy',444);
    Insert into acc_table values('monica',444);
    Insert into acc_table values('Jenifer',444);
    

    下面的查询将产生如图所示的结果

    With BaseData (members,account_id) as
    (
    Select group_concat(name) members, Account_id
    from 
    (Select *, row_number() over ( partition by account_id order by name ) rnum 
    from acc_table) a
    group by account_id
    order by rnum
    )
    select members, count(account_id) Count_of_Shared_Accounts
    from BaseData
    group by members;
    

    结果:

    members             | Count_of_Shared_Accounts
    :------------------ | -----------------------:
    max                 |                        1
    John,Lisa           |                        1
    Jenifer,lucy,monica |                        3
    Lisa,Tiger          |                        2
    

    由于 MySql 不支持 PIVOT 功能,因此很难使用列数是动态的变通方法进行透视(此处相同,因为我们不知道有多少成员可以共享一个帐户)。

    可以在here找到动态将 CSV 字符串拆分为列的详细信息(如最终的预期输出)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      • 2012-10-06
      相关资源
      最近更新 更多