首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用计数进行SQL查询清理

使用计数进行SQL查询清理
EN

Stack Overflow用户
提问于 2013-06-10 22:21:59
回答 1查看 89关注 0票数 3

我有下面的工作查询,但是似乎必须有一种更简单的方法来编写这个查询。我已经尽可能地清理了查询,并将其粘贴到下面,非常感谢您给我的任何帮助/建议。

样本结果:

代码语言:javascript
复制
UserID  | MemberCount | TotalCheck | TotalCCs
---------------------------------------------- 
123     |  75         |  25        | 0 
456     |  74         |  129       | 156

示例查询:

代码语言:javascript
复制
Select BPE.UserID
    ,ISNULL((Select COUNT(*) 
           From clients 
           where fac_id = BPE.billpay_FacID 
               and clt_web_type = 1 
               and clt_relationship = 0),'0') as MemberCount
    ,(Select SUM(achorder_total) as ACHTotal 
        from ACHOrder 
        where achorder_siteid = BPE.siteID 
                    and ACHOrder_PayDate between @Start and @End 
                    and ACHOrder_Status not in ('Voided','Reversed')) As TotalChecks
    ,(Select SUM(CCorder_total) as CCTotal 
        from CCOrder 
        where CCorder_siteid = BPE.siteID 
                    and CCOrder_PayDate between @Start and @End 
                    and CCOrder_Status not in ('Voided','Reversed')) As TotalCCs
From BillingEnabled BPE
Order By BPE.UserID

是否有一种更简单的方法来构造这个查询?

EN

回答 1

Stack Overflow用户

发布于 2013-06-10 23:22:01

如果我正确理解,您想独立计算/和无关的行集吗?我不认为你在那里有太多选择。

我会使用交叉应用(或它的姐妹外部应用)。它稍微改变了语法,但是它可能不会改变执行计划(不过,您应该检查它)。我只是在猜)。

代码语言:javascript
复制
SELECT BPE.UserID, MemberCount.Value, TotalChecks.Value
FROM BillingEnabled BPE
CROSS APPLY (SELECT COUNT(*) as Value 
             FROM clients 
             WHERE fac_id = BPE.billpay_FacID and ...) MemberCount
OUTER APPLY (SELECT SUM(achorder_total) as Value 
             FROM ACHOrder 
             WHERE achorder_siteid = BPE.siteID AND ...) TotalChecks
ORDER BY 1

如果您先执行完整的计算,然后加入结果,那么执行计划可能是不同的。不确定这是否会更有效或更糟。如果您不查询所有内容,只查询一小部分用户,那么如果不以某种方式限制前两个查询,这将是非常低效率的。

代码语言:javascript
复制
WITH MemberCount AS
(
  SELECT fac_id, COUNT(*) as Value
  FROM clients
  WHERE clt_web_type = 1 AND clt_relationship = 0
  GROUP BY fac_id
),
TotalChecks AS
(
  SELECT achorder_siteid, SUM(achorder_total) as Value
  FROM ACHOrder
  WHERE ACHOrder_PayDate BETWEEN @Start AND @End 
    AND ACHOrder_Status NOT IN ('Voided','Reversed')) 
  GROUP BY achorder_siteid
)
SELECT BPE.UserId, MemberCount.Value, TotalChecks.Value
FROM BPE
LEFT OUTER JOIN MemberCount 
  ON MemberCount.fac_id = BPE.billpay_FacID
LEFT OUTER JOIN TotalChecks
  ON TotalChecks.achorder_siteid = BPE.siteID
ORDER BY 1
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17033780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档