Sql 基于多个值返回结果,基于结果设置值

Sql 基于多个值返回结果,基于结果设置值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我试图根据多列中的值返回行。我需要返回成员数据。每个成员都有一个“DiagnostiSID”和“CategoryScore”。min(诊断)是“最严重的诊断”。我需要返回每个患者的每个分类核心的最严重诊断。例如,一个成员有两个不同的CategoryScore,因此我需要同时返回这两个,但另一个成员有两个相同的CategoryScore,我只需要返回一个带有min(DiagnostisId)的成员。我的代码如下,但我不能按CategoryScore分组,否则我会出错 我需要创建列“IsMostSe

我试图根据多列中的值返回行。我需要返回成员数据。每个成员都有一个“DiagnostiSID”和“CategoryScore”。min(诊断)是“最严重的诊断”。我需要返回每个患者的每个分类核心的最严重诊断。例如,一个成员有两个不同的CategoryScore,因此我需要同时返回这两个,但另一个成员有两个相同的CategoryScore,我只需要返回一个带有min(DiagnostisId)的成员。我的代码如下,但我不能按CategoryScore分组,否则我会出错

  • 我需要创建列“IsMostSevereCategory”(我当前的case when子句对此不正确,但我不知道其他方法如何做)。对于每个成员的最小值(categoryscore)和任何空值,需要将其设置为1;但对于其余部分,必须设置为0

  • 当前查询:

    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”无法绑定。