在多个列上进行分组的单个列的计数

时间:2018-12-20 14:09:17

标签: mysql sql

我有两列account_number和customer_id。一个客户可以有多个帐户,但是一个帐户不能有多个客户。

我已通过LOAD DATA INFILE命令将包含account_num及其对应的customer_id的文件转储到db。现在,我试图通过查询来验证文件中多次出现的任何帐户在两个不同的行中是否具有相同的customer_id或不同的customer_id。

要求:我想退回已多次访问但具有不同客户ID的帐户

我尝试了group by,但是没有得到想要的结果。 这是我的查询,没有给出期望的结果

SELECT ACCOUNT_NUM,UNIQUE_CUSTOMER_ID,COUNT(UNIQUE_CUSTOMER_ID) 
FROM LINKAGE_FILE   
GROUP BY ACCOUNT_NUM, UNIQUE_CUSTOMER_ID 
HAVING COUNT(ACCOUNT_NUM) > 1 AND COUNT(UNIQUE_CUSTOMER_ID) = 1;

希望我很清楚。

3 个答案:

答案 0 :(得分:1)

您只需对每个COUNT(DISTINCT..)使用account_num就可以获取唯一客户ID的计数,并在HAVING子句中过滤出计数大于1的情况:

SELECT
  ACCOUNT_NUM, 
  COUNT(DISTINCT CUSTOMER_ID) AS unique_customer_count 
FROM LINKAGE_FILE 
GROUP BY ACCOUNT_NUM
HAVING unique_customer_count > 1

答案 1 :(得分:0)

您可以使用EXISTS

SELECT lf.*
FROM LINKAGE_FILE lf
WHERE EXISTS (SELECT 1 FROM LINKAGE_FILE lf1 WHERE lf1.ACCOUNT_NUM = lf.ACCOUNT_NUM AND lf1.UNIQUE_CUSTOMER_ID <> lf.UNIQUE_CUSTOMER_ID);

但是,您也可以与查询聚合:

SELECT ACCOUNT_NUM, COUNT(DISTINCT UNIQUE_CUSTOMER_ID) 
FROM LINKAGE_FILE   
GROUP BY ACCOUNT_NUM
HAVING COUNT(DISTINCT UNIQUE_CUSTOMER_ID) > 1;

通过这种方式,您只能获得具有两个或更多ACCOUNT_NUM的{​​{1}}。

答案 2 :(得分:0)

像这样将客户签入联接查询

DROP TABLE if exists t;
create table t(accountid int,cid int);
insert into t values
(1,1),(1,2).(1,1),(2,3),(3,4),(3,4);

    select distinct t.accountid,t.cid 
from t
join
(
select accountid,count(distinct cid) cids
from t
group by accountid having cids > 1 
) s on s.accountid = t.accountid;

+-----------+------+
| accountid | cid  |
+-----------+------+
|         1 |    1 |
|         1 |    2 |
+-----------+------+
2 rows in set (0.00 sec)