Sql 基于多个值返回结果,基于结果设置值
我试图根据多列中的值返回行。我需要返回成员数据。每个成员都有一个“DiagnostiSID”和“CategoryScore”。min(诊断)是“最严重的诊断”。我需要返回每个患者的每个分类核心的最严重诊断。例如,一个成员有两个不同的CategoryScore,因此我需要同时返回这两个,但另一个成员有两个相同的CategoryScore,我只需要返回一个带有min(DiagnostisId)的成员。我的代码如下,但我不能按CategoryScore分组,否则我会出错Sql 基于多个值返回结果,基于结果设置值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我试图根据多列中的值返回行。我需要返回成员数据。每个成员都有一个“DiagnostiSID”和“CategoryScore”。min(诊断)是“最严重的诊断”。我需要返回每个患者的每个分类核心的最严重诊断。例如,一个成员有两个不同的CategoryScore,因此我需要同时返回这两个,但另一个成员有两个相同的CategoryScore,我只需要返回一个带有min(DiagnostisId)的成员。我的代码如下,但我不能按CategoryScore分组,否则我会出错 我需要创建列“IsMostSe
SELECT
sq.MemberID,
sq.FirstName,
sq.LastName,
sq.DiagnosisID AS MostSevereDiagnosis,
diagnosisdescription,
DiagnosisCategoryID,
CategoryDescription,
CategoryScore,
CASE WHEN DiagnosisCategoryID IS NULL THEN 1 ELSE 0 END AS IsMostSevereCategory
FROM
(select ROW_NUMBER() OVER(PARTITION BY mem.memberid ORDER BY md.DiagnosisID ASC) AS ROWNUM,
mem.MemberID,
mem.FirstName,
mem.LastName,
md.DiagnosisID,
d.diagnosisdescription,
dc.DiagnosisCategoryID,
dc.CategoryDescription,
dc.CategoryScore
from dbo.member mem
left join dbo.Memberdiagnosis md on mem.MemberID = md.MemberID
left join Diagnosis d on md.DiagnosisID = d.DiagnosisID
left join DiagnosisCategoryMap dcm on d.DiagnosisID = dcm.DiagnosisID
left join DiagnosisCategory dc on dc.DiagnosisCategoryID = dcm.DiagnosisCategoryID) sq
WHERE ROWNUM =1
目前的结果是:
MemID FIRST LAST MostSevere DiagDesc CatID CatDesc CatScore IsMostSevere
1 John Smith 2 Diag2 2 CatB 20 0
1 John Smith 4 Diag4 3 CatC 30 0
2 Jack Smith NULL NULL NULL NULL NULL 1
3 Will Smyth 3 Diag3 3 CatC 30 0
3 Will Smyth 4 Diag4 3 CatC 30 0
所以基本上我需要第1行和第4行的IsMostSevere=1;需要删除第5行。试试这个,如果不起作用,告诉我。 我对您的行号进行了修改,将您的查询置于CTE格式以使其更具可读性,并创建了另一个查询以获得mincat分数
WITH C AS(
SELECT ROW_NUMBER() OVER(PARTITION BY mem.memberid,DiagnosisCategoryID ORDER BY md.DiagnosisID ASC) AS ROWNUM,
mem.MemberID,
mem.FirstName,
mem.LastName,
md.DiagnosisID,
d.diagnosisdescription,
dc.DiagnosisCategoryID,
dc.CategoryDescription,
dc.CategoryScore
FROM dbo.member mem
LEFT JOIN dbo.Memberdiagnosis md on mem.MemberID = md.MemberID
LEFT JOIN Diagnosis d on md.DiagnosisID = d.DiagnosisID
LEFT JOIN DiagnosisCategoryMap dcm on d.DiagnosisID = dcm.DiagnosisID
LEFT JOIN DiagnosisCategory dc on dc.DiagnosisCategoryID = dcm.DiagnosisCategoryID
),D AS(
SELECT min(categoryscore) AS mincat
,MemberID
FROM dbo.member mem
LEFT JOIN dbo.Memberdiagnosis md on mem.MemberID = md.MemberID
LEFT JOIN Diagnosis d on md.DiagnosisID = d.DiagnosisID
LEFT JOIN DiagnosisCategoryMap dcm on d.DiagnosisID = dcm.DiagnosisID
LEFT JOIN DiagnosisCategory dc on dc.DiagnosisCategoryID = dcm.DiagnosisCategoryID
GROUP BY MemberID
)
SELECT C.MemberID,
C.FirstName,
C.LastName,
C.DiagnosisID AS MostSevereDiagnosis,
C.diagnosisdescription,
C.DiagnosisCategoryID,
C.CategoryDescription,
C.CategoryScore,
CASE WHEN D.mincat = C.CategoryScore THEN 1 ELSE 0 END AS IsMostSevereCategory
FROM C
LEFT JOIN D ON (C.MemberID = D.MemberID)
WHERE ROWNUM = 1
为什么在子查询中使用ROWNUM?对不起,应该已经澄清了。我刚刚编辑了我的帖子。我最初使用了WHERE ROWNUM=1,因此只有最严重的诊断才会返回。但它不会同时返回MemberID 1的CategoryScore值。出现了一些错误。第一个是其中一个连接的问题。将其更改为:FROM dbo.Memberdiagnosis md LEFT JOIN Member mem on md.MemberID=mem.MemberID现在我得到“无效的列名'CatID'我更改了它,请重试设置此错误:Msg 8120,级别16,状态1,第18行列'dbo.member.MemberID'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。我忘记了GROUP BY MemberIDMsg 4104,级别16,状态1,第26行多部分标识符。”“sq.MemberID”无法绑定。Msg 4104,级别16,状态1,第27行多部分标识符“sq.FirstName”无法绑定。Msg 4104,级别16,状态1,第28行多部分标识符“sq.LastName”无法绑定。Msg 4104,级别16,状态1,第29行多部分标识符“sq.Diagnosid”无法绑定。