【问题标题】:Filter a table using COUNT SQL Server使用 COUNT SQL Server 过滤表
【发布时间】:2020-12-16 03:31:04
【问题描述】:

我是 SQL 新手。我已经编写了下面的代码,但被 COUNT 函数卡住了。我只想在 Service 表上显示具有 2 个或更多 ServiceID 的 ClientID。我最初尝试在服务表的连接中进行嵌套选择,但收到错误消息。现在使用下面的代码,我收到一个错误

消息 164,第 15 级,状态 1,第 13 行
每个 GROUP BY 表达式必须至少包含一个不是外部引用的列。

我正在努力实现以下目标。谢谢!

client Id Service ID Count
1 2 3
1 3 3
1 4 3
2 5 4
2 6 4
2 7 4
2 8 4
SELECT DISTINCT 
    O.OrgName,
    Referral.ClientID, 
    Client.FirstName, 
    Client.LastName, 
    P.ProviderName AS 'School',
    E.ProgramID,
    LI.ListLabel AS 'Reason',
    Race.ListLabel AS 'Race/Ethnicity',
    Gender.ListLabel AS 'Sex/Gender',
    [ServiceId],
    (SELECT COUNT([ServiceID])
     GROUP BY Referral.ClientID
     HAVING COUNT([ServiceID]) >= 2) AS 'Number of Supports'
FROM 
    ProviderReferral Referral
JOIN 
    Provider P ON ReferFromProviderID = P.EntityID
JOIN 
    ProviderReferralExt ON Referral.ProviderReferralID = ProviderReferralExt.ProviderReferralID
INNER JOIN 
    MultiSelectValue MSV ON MSV.ContextID = Referral.ProviderReferralID 
                         AND MSV.ContextTypeID = 87 
                         AND MSV.ListID = 1000001179
INNER JOIN 
    Client ON Referral.ClientID = Client.EntityID
INNER JOIN 
    EnrollmentMember ON client.EntityID = EnrollmentMember.ClientID
INNER JOIN 
    Enrollment E ON EnrollmentMember.EnrollmentID = E.EnrollmentID 
                 AND E.X_CMNonCM = 1
INNER JOIN 
    ListItem LI ON LI.ListValue = MSV.ListValue 
                AND LI.ListID = 1000001179
INNER JOIN 
    ListItem Race ON Race.ListValue = client.Race 
                  AND Race.ListID = 1000000068
INNER JOIN 
    ListItem Gender ON Gender.ListValue = Client.Gender 
                    AND Gender.ListID = 1
INNER JOIN 
    Service ON E.EnrollmentID = Service.EnrollmentID -- the supports table
JOIN 
    Organization O ON o.EntityID = p.OrganizationID
WHERE 
    P.OrganizationID = 33847
    AND E.ProgramID = 1325 
    AND referral.DeletedDate = '9999-12-31' 
    AND o.DeletedDate = '9999-12-31' 
    AND enrollmentmember.DeletedDate = '9999-12-31'
ORDER BY
    referral.ClientID, client.FirstName

【问题讨论】:

    标签: sql-server join count


    【解决方案1】:

    您可以使用窗口函数count如下:

    Select * from
    (Select ...
           ...
           Count([ServiceID]) over (partition by referral.clientid) as cnt
    From ...
         ...
    ) t where cnt > 2;
    

    请注意order by 应该是查询中的最后一个子句。相应地使用它。

    根据评论中的请求,将代码添加到您的原始查询中,如下所示:

    select * from
    (select Referral.ClientID, 
           Client.FirstName, 
           Client.LastName, 
           P.ProviderName as School,
           E.ProgramID,
           LI.ListLabel as Reason,
           Race.ListLabel as "Race/Ethnicity",
           Gender.ListLabel as "Sex/Gender",
           [ServiceId],
           Count([ServiceID]) over (partition by referral.clientid) as cnt -- this -- added open parenthesis before partition
    FROM ProviderReferral Referral
        JOIN Provider P on ReferFromProviderID=P.EntityID
        JOIN ProviderReferralExt on Referral.ProviderReferralID=ProviderReferralExt.ProviderReferralID
        INNER JOIN MultiSelectValue MSV on MSV.ContextID = Referral.ProviderReferralID AND 
          MSV.ContextTypeID=87 AND MSV.ListID=1000001179
        INNER JOIN Client on Referral.ClientID=Client.EntityID
        INNER JOIN EnrollmentMember on client.EntityID=EnrollmentMember.ClientID
        INNER JOIN Enrollment E on EnrollmentMember.EnrollmentID=E.EnrollmentID and E.X_CMNonCM=1
        INNER JOIN ListItem LI on LI.ListValue = MSV.ListValue and LI.ListID = 1000001179
        INNER JOIN ListItem Race on Race.ListValue=client.Race and Race.ListID=1000000068
        INNER JOIN ListItem Gender on Gender.ListValue=Client.Gender and Gender.ListID=1
        INNER JOIN Service on E.EnrollmentID=Service.EnrollmentID -- the supports table
        JOIN Organization O on o.EntityID =p.OrganizationID
    Where P.OrganizationID=33847
    and E.ProgramID=1325 
    and referral.DeletedDate = '9999-12-31' and o.DeletedDate='9999-12-31' 
    and enrollmentmember.DeletedDate='9999-12-31') t
    where cnt > 2 -- this
    order by ClientID, FirstName
    

    【讨论】:

    • 你能解释一下我是如何将它合并到我的脚本中的吗?这到底去哪里了? @大力水手
    • 我在“分区”附近遇到错误的语法。这是我使用的代码count([ServiceID]) over partition by referral.ClientID) as cnt@popeye
    • 我意识到语法错误,您的第二次编辑缺少一个打开 ( 在分区之前。但现在我收到此错误消息...“ORDER BY 子句在视图中无效,内联函数,派生表、子查询和公用表表达式,除非还指定了 TOP、OFFSET 或 FOR XML。" @popeye
    • 更新 - 我将代码修改为 as t 而不是 t 并且有效,但现在 order by 有语法错误。 @popeye
    • 我现在只是要删除订单 - 它似乎没有它。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多