我假设你有以下2个表。
CREATE TABLE table1 (RowId INT PRIMARY KEY, MemberIdentifier VARCHAR(255));
INSERT INTO table1 (RowId, MemberIdentifier)
VALUES
(1,'111111111'), (2, '123456789'), (3, '146782452'), (4, '111111111'),(5,'123456789'), (6,'146782452'), (7,'111111111');
CREATE TABLE table2 (RowId INT PRIMARY KEY, Status VARCHAR(255));
INSERT INTO table2 (RowId, Status)
VALUES
(1,'In Progress'), (2,'Complete' ), (3,'Not Started'), (4,'Complete' ), (5,'Complete' ), (6,'Not Started'), (7,'Complete' );
假设这些表中没有数百万条记录,您可以使用以下查询来实现您想要的结果。
SELECT CASE WHEN not_started.Status = 'Not Started'
THEN 'Not Started'
WHEN in_progress.Status = 'In Progress'
THEN 'In Progress'
WHEN complete.Status = 'Complete'
THEN 'Complete'
END AS over_all_status,
COUNT(*) AS MemberIdentifierCount
FROM (SELECT DISTINCT t1.MemberIdentifier
FROM table1 t1) main
LEFT OUTER JOIN
(SELECT DISTINCT t1.MemberIdentifier, t2.Status
FROM table1 t1,
table2 t2
WHERE t1.RowId = t2.RowId
AND t2.Status = 'In Progress') in_progress
ON (main.MemberIdentifier = in_progress.MemberIdentifier)
LEFT OUTER JOIN
(SELECT DISTINCT t1.MemberIdentifier, t2.Status
FROM table1 t1,
table2 t2
WHERE t1.RowId = t2.RowId
AND t2.Status = 'Not Started') not_started
ON (main.MemberIdentifier = not_started.MemberIdentifier)
LEFT OUTER JOIN
(SELECT DISTINCT t1.MemberIdentifier, t2.Status
FROM table1 t1,
table2 t2
WHERE t1.RowId = t2.RowId
AND t2.Status = 'Complete') complete
ON (main.MemberIdentifier = complete.MemberIdentifier)
GROUP BY over_all_status;
基本上,查询会创建一个包含所有三种可能状态的每个MemberIdentifier记录。然后根据总体状态对结果进行分组并输出计数。
查询的输出结果为:
![enter image description here](https://istack.dev59.com/8vInt.webp)