【问题标题】:Subquery Where clause invalid in select list选择列表中的子查询 Where 子句无效
【发布时间】:2015-09-30 17:19:51
【问题描述】:

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

列 'dbo.PersonDetailB.INRInRange' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。”

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

【问题讨论】:

  • dbo.PersonDetailSpecialty.PracticeAbbrevName替换practiceabbrevname,

标签: sql sql-server join group-by subquery


【解决方案1】:

创建一个计数 PersonDetailB.INRInRange 的子查询并将其与原始查询 LEFT OUTER JOIN。

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

【讨论】:

  • 按照这些思路,我不能在 PID=PID 和 INRInRange='True' 上加入一个表
  • 是的,你可以这样做。
【解决方案2】:

这句话的问题:

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 

【讨论】:

  • INRInRange是位数据类型,所以Max算子无效。
  • @JohnS 。 . .将其添加到GROUP BY 怎么样?
【解决方案3】:

在子查询中的 where 条件上以不同的名称加入单独的表。

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, 

作为整体选择查询的一个简单部分

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多