使用子查询(SUM)进行聚合查询

时间:2016-04-29 17:15:32

标签: sql sql-server

我有以下查询:

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 output

我想通过UserId聚合它。提前谢谢。

2 个答案:

答案 0 :(得分:2)

涉及查询重写次数最少的选项是将现有查询删除到CTE或临时表中,如下所示:

; with CTE as (MyQueryHere)

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

答案 1 :(得分:1)

哇,这是一个疯狂的查询,你已经去了那里。

试试这个:

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使您的查询更有效,更可读

接下来,您似乎正在尝试使用SUM百分比。不确定你想要返回什么样的数据,但也许AVG会更合适?我想不出你为什么要这样做的任何实际原因。

最后,APH的答案肯定会起作用(假设您的原始查询有效),但考虑到查询的混淆和低效,我肯定会重写它。

如果您有任何疑问,请与我们联系。