select 列表中的子查询 Where 子句无效

Subquery Where clause invalid in select list

我正在尝试创建一个分子 (num) 和分母 (den) 列,稍后我将使用它们来创建度量值。在我的分子列中,我需要有一个我的分母列没有的标准。当我将 where 子句添加到我的子查询时,出现以下错误。我不想将 INRInRange 添加到我的 Group By 子句中。

Column 'dbo.PersonDetailB.INRInRange' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause."

SELECT 
        dbo.PersonDetailSpecialty.PracticeAbbrevName, 
        (SELECT COUNT(DISTINCT dbo.Problem.PID) WHERE PersonDetailB.INRInRange='True') AS num, 
        COUNT(DISTINCT dbo.Problem.PID) AS den 
FROM         
        dbo.PersonDetailB
RIGHT OUTER JOIN
        dbo.PersonDetailSpecialty ON dbo.PersonDetailB.PID = dbo.PersonDetailSpecialty.PID
LEFT OUTER JOIN
        dbo.Problem ON dbo.PersonDetailSpecialty.PID = dbo.Problem.PID

GROUP BY 
        practiceabbrevname

这个语句的问题:

SELECT dbo.PersonDetailSpecialty.PracticeAbbrevName, 
       (SELECT COUNT(DISTINCT dbo.Problem.PID) WHERE PersonDetailB.INRInRange = 'True') AS num, 
       COUNT(DISTINCT dbo.Problem.PID) AS den 

PersonDetailB.INRInRange1在每个组中没有唯一值。有可能是这样。一种方法是将其添加到 GROUP BY:

GROUP BY practiceabbrevname, PersonDetailB.INRInRange

另一种方法是在子查询中使用聚合函数:

SELECT dbo.PersonDetailSpecialty.PracticeAbbrevName, 
       (SELECT COUNT(DISTINCT dbo.Problem.PID) WHERE MAX(PersonDetailB.INRInRange) = 'True') AS num, 
       COUNT(DISTINCT dbo.Problem.PID) AS den 

创建一个计数 PersonDetailB.INRInRange 的子查询并将其与原始查询进行左外连接。

SELECT Main.PracticeAbbrevName, InRange.Num AS num, Main.den
FROM
    (SELECT 
            dbo.PersonDetailSpecialty.PracticeAbbrevName, 
            COUNT(DISTINCT dbo.Problem.PID) AS den 
    FROM         
            dbo.PersonDetailB
    RIGHT OUTER JOIN
            dbo.PersonDetailSpecialty ON dbo.PersonDetailB.PID = dbo.PersonDetailSpecialty.PID
    LEFT OUTER JOIN
            dbo.Problem ON dbo.PersonDetailSpecialty.PID = dbo.Problem.PID
    GROUP BY 
            practiceabbrevname) Main
    LEFT OUTER JOIN
            (SELECT practiceabbrevname, COUNT(DISTINCT dbo.Problem.PID) Num WHERE PersonDetailB.INRInRange='True' GROUP BY practiceabbrevname) InRange ON Main.practiceabbrevname = InRange.practiceabbrevname

在子查询中的 where 条件上加入一个单独的 table 作为不同的名称。

SELECT    PersonDetailSpecialty.PracticeAbbrevName,
          COUNT(PDTRUE.PID) as num, 
          COUNT(dbo.Problem.PID) AS den

FROM      dbo.PersonDetailSpecialty LEFT OUTER JOIN
          dbo.PersonDetailB as PDTRUE ON dbo.PersonDetailSpecialty.PID = PDTRUE.PID and PDTRUE.INRInRange='True' LEFT OUTER JOIN
          dbo.PersonDetailB ON dbo.PersonDetailSpecialty.PID = PersonDetailB.PID LEFT OUTER JOIN
          dbo.Medicate ON dbo.PersonDetailSpecialty.PID = dbo.Medicate.PID LEFT OUTER JOIN
          dbo.Problem ON dbo.PersonDetailSpecialty.PID = dbo.Problem.PID

GROUP BY  PersonDetailSpecialty.PracticeAbbrevName

这是FROM部分需要的相关代码

dbo.PersonDetailSpecialty LEFT OUTER JOIN dbo.PersonDetailB as PDTRUE 
ON dbo.PersonDetailSpecialty.PID = PDTRUE.PID and PDTRUE.INRInRange='True'

这让您可以添加

COUNT(PDTRUE.PID) as num, 

作为整体 select 查询的简单部分