SQL查询,我需要每人1行,最低Id为两列
我有一个查询,它返回以下结果:SQL查询,我需要每人1行,最低Id为两列,sql,sql-server,tsql,sql-server-2014,Sql,Sql Server,Tsql,Sql Server 2014,我有一个查询,它返回以下结果: SELECT Mem.MemberID, Mem.LastName + ', ' + Mem.FirstName AS Name, MD.DiagnosisID, Diag.DiagnosisDescription, DC.DiagnosisCategoryID, DC.CategoryDescription, DC.CategoryScore FROM Member AS Mem LEFT OUTER JOIN
SELECT
Mem.MemberID, Mem.LastName + ', ' + Mem.FirstName AS Name,
MD.DiagnosisID,
Diag.DiagnosisDescription,
DC.DiagnosisCategoryID, DC.CategoryDescription, DC.CategoryScore
FROM
Member AS Mem
LEFT OUTER JOIN
MemberDiagnosis AS MD ON Mem.MemberID = MD.MemberID
LEFT OUTER JOIN
Diagnosis AS Diag ON MD.DiagnosisID = Diag.DiagnosisID
LEFT OUTER JOIN
DiagnosisCategoryMap AS Map ON Map.DiagnosisID = Diag.DiagnosisID
LEFT OUTER JOIN
DiagnosisCategory AS DC ON DC.DiagnosisCategoryID = Map.DiagnosisCategoryID
ORDER BY
Name ASC
在该查询和结果集中,我如何才能使用
请尝试以下查询:
ID | Name | D.ID | D.Desc | C.ID | C. Desc | C.Score
----+---------------+------+----------------+------+-------------+----------
2 | Smith, Jack | NULL | NULL | NULL | NULL | NULL
1 | Smith, John | 2 | Test Diagnosis | 2 | Category B | 20
1 | Smith, John | 4 | Test Diagnosis | 3 | Category C | 30
3 | Smyth, Will | 3 | Test Diagnosis | 3 | Category C | 30
3 | Smyth, Will | 4 | Test Diagnosis | 3 | Category C | 30
答案因您的数据库供应商而异(MySQL有一个答案,其他人则有一个不同的答案)。您使用的是什么关系数据库管理系统?我使用的是MS SQL 2014。它几乎满足了我的需求。唯一的问题是,没有诊断的杰克没有出现在这个问题上。虽然它做了我需要它为另外两个做的事情。考虑到它应该拉的第一个左外连接,没有?@ShaneWorkman只需将
内连接
替换为左连接
。我更新了我的答案,看看吧
SELECT T1.*,Diag2.DiagnosisDescription, DC2.CategoryDescription, DC2.CategoryScore
FROM (SELECT DISTINCT
Mem.MemberID, Mem.LastName + ', ' + Mem.FirstName AS Name,
MIN(MD.DiagnosisID) OVER(PARTITION BY Mem.MemberID) AS DiagnosisID,
MIN(ISNULL(DC.DiagnosisCategoryID,1)) OVER(PARTITION BY Mem.MemberID) AS DiagnosisCategoryID
FROM
Member AS Mem
LEFT OUTER JOIN
MemberDiagnosis AS MD ON Mem.MemberID = MD.MemberID
LEFT OUTER JOIN
Diagnosis AS Diag ON MD.DiagnosisID = Diag.DiagnosisID
LEFT OUTER JOIN
DiagnosisCategoryMap AS Map ON Map.DiagnosisID = Diag.DiagnosisID
LEFT OUTER JOIN
DiagnosisCategory AS DC ON ISNULL(DC.DiagnosisCategoryID,1) = ISNULL(Map.DiagnosisCategoryID,1) ) AS T1
LEFT JOIN Diagnosis AS Diag2 ON T1.DiagnosisID = Diag2.DiagnosisID
LEFT JOIN DiagnosisCategory AS DC2 ON T1.DiagnosisCategoryID = DC2.DiagnosisCategoryID
ORDER BY T1.NAME