Mysql 如何对唯一查询进行复杂计数

Mysql 如何对唯一查询进行复杂计数,mysql,sql,distinct,Mysql,Sql,Distinct,我试图从MySQL/SQL数据库中获取特定类型的计数。表中有一列记录是ID,第二列记录是另一个引用ID。一些引用ID是整数,而一些引用ID中有文本。与此类似: ID | RefID 123 | 1234567 123 | 1234568 123 | 1234569 123 | ABC/US12/12345 123 | ABC/AA12/12345 123 | ABC/BB12/12345 如果数字是整数,则表示美国。 对于文本ID,“ABC”部分始终相同,但“AA”和“BB”代表国家代码。有

我试图从
MySQL
/
SQL
数据库中获取特定类型的计数。表中有一列记录是ID,第二列记录是另一个引用ID。一些引用ID是整数,而一些引用ID中有文本。与此类似:

ID  | RefID
123 | 1234567
123 | 1234568
123 | 1234569
123 | ABC/US12/12345
123 | ABC/AA12/12345
123 | ABC/BB12/12345
如果数字是整数,则表示美国。 对于文本ID,“ABC”部分始终相同,但“AA”和“BB”代表国家代码。有时是“我们”,如“ABC/US12/12345”

对于每个ID,我希望为其各自的参考ID统计唯一的国家。我猜这将使用
不同的RefID
,看起来像这样:

SELECT ID, count(DISTINCT RefID)
FROM TABLE
GROUP BY ID;
SELECT ID,
       COUNT(DISTINCT CASE WHEN RefID REGEXP '^[0-9]+$' THEN 'US'
                           WHEN RefID LIKE '%/US%' THEN 'US'
                           ELSE RefID
                      END)
FROM CONTINUITYCHILD_P
GROUP BY ID;
除了简单的
count(DISTINCT RefID)
之外,我希望DISTINCT与任何整数RefID或带有
子字符串(RefID,5,2)
=“US”的RefID相关,否则
DISTINCT
对于RefID应该是
DISTINCT(SUBSTRING(RefID,5,2))
。因此,上述数据的计数为
3


有谁能告诉我这种类型的函数调用什么或如何实现吗?

您似乎想要这样的东西:

SELECT ID, count(DISTINCT RefID)
FROM TABLE
GROUP BY ID;
SELECT ID,
       COUNT(DISTINCT CASE WHEN RefID REGEXP '^[0-9]+$' THEN 'US'
                           WHEN RefID LIKE '%/US%' THEN 'US'
                           ELSE RefID
                      END)
FROM CONTINUITYCHILD_P
GROUP BY ID;

如果您需要从其他
RefID
s提取国家/地区,则可能需要其他逻辑。

您似乎需要以下内容:

SELECT ID, count(DISTINCT RefID)
FROM TABLE
GROUP BY ID;
SELECT ID,
       COUNT(DISTINCT CASE WHEN RefID REGEXP '^[0-9]+$' THEN 'US'
                           WHEN RefID LIKE '%/US%' THEN 'US'
                           ELSE RefID
                      END)
FROM CONTINUITYCHILD_P
GROUP BY ID;

如果需要从其他
RefID
s提取国家/地区,则可能需要附加逻辑。

第一个答案几乎正确。
实际上,要求将所有整数refid更改为“US”,然后从所有其他refid中提取国家代码

以下是正确的方法:

SELECT 
ID, 
COUNT(DISTINCT 
    CASE 
    WHEN RefID REGEXP '^[0-9]+$' THEN 'US'
    ELSE SUBSTRING(RefID, 5, 2)
    END
) CountryCount
FROM TABLE
GROUP BY ID
ORDER BY CountryCount DESC;

第一个答案几乎是正确的。
实际上,要求将所有整数refid更改为“US”,然后从所有其他refid中提取国家代码

以下是正确的方法:

SELECT 
ID, 
COUNT(DISTINCT 
    CASE 
    WHEN RefID REGEXP '^[0-9]+$' THEN 'US'
    ELSE SUBSTRING(RefID, 5, 2)
    END
) CountryCount
FROM TABLE
GROUP BY ID
ORDER BY CountryCount DESC;

DISTINCT
不是一个函数,它是一个集合量化器。删除那些额外的括号以使代码更清晰,即只需
count(DISTINCT RefID)
。好的,很高兴知道这一点。我已经澄清了示例代码。
DISTINCT
不是一个函数,它是一个集合量化器。删除那些额外的括号以使代码更清晰,即只需
count(DISTINCT RefID)
。好的,很高兴知道这一点。我已经澄清了示例代码。