繁体   English   中英

汇总查询和子查询(SUM)

[英]Aggregate query with subquery (SUM)

我有以下查询:

SELECT UserId, (
                0.099 *
                    (   
                    CASE WHEN 
                    (SELECT AcceleratedProfitPercentage FROM CustomGroups cg 
                    INNER JOIN UserCustomGroups ucg ON ucg.CustomGroupId = cg.Id
                    WHERE Packs.UserCustomGroupId = ucg.Id) 
                    IS NOT NULL THEN 
                    ((SELECT AcceleratedProfitPercentage FROM CustomGroups cg 
                    INNER JOIN UserCustomGroups ucg ON ucg.CustomGroupId = cg.Id
                    WHERE Packs.UserCustomGroupId = ucg.Id)*1.0) / (100*1.0)
                    ELSE 1
                    END
                    )
                )
                As amount
                FROM Packs WHERE Id IN (
                SELECT ap.Id FROM Packs ap JOIN Users u ON ap.UserId = u.UserId 
                WHERE ap.MoneyToReturn > ap.MoneyReturned AND 
                u.Mass LIKE '1%');

产生正确的输出。 但是我不知道如何正确地汇总它。 我尝试使用标准的GROUP BY,但收到错误消息(选择列表中的“ Packs.UserCustomGroupId”列无效,因为它既不包含在聚合函数中也不包含在GROUP BY子句中)。 有任何想法吗? 这是我当前得到的输出:

sql输出

我想通过UserId进行汇总。 提前致谢。

涉及最少查询重写的选项是将现有查询放入CTE或临时表中,如下所示:

; with CTE as (MyQueryHere)

Select UserID, sum(amount)
from CTE
Group by UserID

哇,这是一个疯狂的查询。

尝试这个:

SELECT  UserId,
        0.099 * SUM(t.Amount) AS [Amount SUM]
FROM Packs P
JOIN Users U
    ON P.UserID = U.UserID
LEFT OUTER JOIN UserCustomGroups UCG
    ON P.UserCustomGroupID = UCG.ID
LEFT OUTER JOIN CustomGroups CG
    ON UCG.CustomGroupID = CG.ID
CROSS APPLY
    (
        SELECT CASE WHEN CG.ID IS NULL
            THEN 1
            ELSE CG.AcceleratedProfitPercentage / 100
        END AS [Amount]
    ) t
WHERE P.MoneyToReturn > P.MoneyReturned
AND U.Mass LIKE '1%'
GROUP BY UserID

首先,将任何数字乘以1是没有意义的,但是我在您的原始帖子中看到了两次。 我不确定是什么原因导致的,但这是不必要的。

同样,使用CROSS APPLY将消除您重复子查询的需要。 当然,它的速度较慢(因为它将在返回的每一行上运行),但是在这种情况下,我认为这很有意义...使用左外部联接而不是CASE-SELECT-IS NULL使查询效率更高并且可读性更高。

接下来,您似乎正在尝试对百分比求和。 不确定要返回什么样的数据,但是也许AVG更合适? 我无法想到您要这样做的任何实际原因。

最后,APH的答案肯定会起作用(假设您的原始查询有效),但是鉴于您的查询过于混乱和效率低下,我肯定会重写它。

请让我知道,如果你有任何问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM