如何在sql oracle中从一行三个表中得到两个不同的行?

cidc1ykv  于 2023-03-17  发布在  Oracle
关注(0)|答案(1)|浏览(124)

我有三张table看起来有点像这样。
人员表
| 识别号|人|
| - ------|- ------|
| 1个|名称1|
| 第二章|名称2|
| 三个|名称3|
类型到人员表
| 质量标准|个人ID|
| - ------|- ------|
| 四个|1个|
| 八个|1个|
| 十个|三个|
请求饱和度表
| 质量标准|状态ID|
| - ------|- ------|
| 四个|1个|
| 四个|1个|
| 四个|无|
| 八个|无|
| 八个|1个|
我需要计算每个人有多少个身份标识,所以结果应该是这样的。
| 人|地位|计数|
| - ------|- ------|- ------|
| 名称1|良好|三个|
| 名称1|坏|第二章|
我试过像这样使用distinct,但它不起作用。

SELECT PersonTable.Perosn AS person, 
    (DISTINCT RequestSatusTable.StatusId) AS status,
    COUNT(RequestSatusTable.StatusId)
FROM   PersonTable
JOIN TypeToPersonTable ON PersonTable.ID = TypeToPersonTable.PersonID
JOIN RequestSatusTable ON RequestSatusTable.SPECID= TypeToPersonTable.SPECID
GROUP BY PersonTable.Person

我想不出来。如果你能帮忙我将不胜感激。

qojgxg4l

qojgxg4l1#

statusid包含在GROUP BY中,并使用CASE表达式将statusid1/0转换为good/bad

SELECT p.Person,
       CASE r.StatusId WHEN 1 THEN 'good' ELSE 'bad' END AS status,
       COUNT(*) AS count
FROM   PersonTable p
       JOIN TypeToPersonTable t
       ON p.ID = t.PersonID
       JOIN RequestSatusTable r
       ON r.SPECID= t.SPECID
GROUP BY
       p.Person,
       r.StatusId

其中,对于示例数据:

CREATE TABLE PersonTable (ID, Person) AS
SELECT 1, 'name1' FROM DUAL UNION ALL
SELECT 2, 'name2' FROM DUAL UNION ALL
SELECT 3, 'name3' FROM DUAL;

CREATE TABLE TypeToPersonTable (SPECID, PersonID) AS
SELECT 4, 1 FROM DUAL UNION ALL
SELECT 8, 1 FROM DUAL UNION ALL
SELECT 10, 3 FROM DUAL;

CREATE TABLE RequestSatusTable (SPECID, StatusID) AS
SELECT 4, 1 FROM DUAL UNION ALL
SELECT 4, 1 FROM DUAL UNION ALL
SELECT 4, 0 FROM DUAL UNION ALL
SELECT 8, 0 FROM DUAL UNION ALL
SELECT 8, 1 FROM DUAL;

输出:
| 人员|状态|计数|
| - ------|- ------|- ------|
| 名称1|良好|三个|
| 名称1|坏|第二章|
fiddle

相关问题