Sql 带子查询的聚合查询(总和)

Sql 带子查询的聚合查询(总和),sql,sql-server,Sql,Sql Server,我有以下疑问: SELECT UserId, ( 0.099 * ( CASE WHEN (SELECT AcceleratedProfitPercentage FROM CustomGroups cg INNER JOIN UserCustomGroups ucg ON ucg.CustomGr

我有以下疑问:

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 claus中)。有什么想法吗?以下是我当前获得的输出:


我想按UserId聚合它。提前感谢。

包含最少查询重写的选项是将现有查询放到CTE或temp表中,如下所示:

; with CTE as (MyQueryHere)

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

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

; 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都是毫无意义的,但我在你原来的帖子中看到过两次。我不确定是什么导致的,但这是不必要的

此外,使用交叉应用将消除重复子查询的需要。诚然,它的速度较慢(因为它将在返回的每一行上运行),但我认为在这种情况下是有意义的……使用左外部联接而不是case-SELECT-IS NULL可以使查询更高效、更可读

接下来,您似乎正在尝试对百分比求和。不确定您希望返回哪种类型的数据,但AVG可能更合适?我想不出有什么实际的理由让你这么做

最后,APH的答案肯定会有效(假设您的原始查询有效),但考虑到您的查询的模糊性和低效性,我肯定会重写它


如果您有任何问题,请告诉我。

哇,这是一个疯狂的问题

试试这个:

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都是毫无意义的,但我在你原来的帖子中看到过两次。我不确定是什么导致的,但这是不必要的

此外,使用交叉应用将消除重复子查询的需要。诚然,它的速度较慢(因为它将在返回的每一行上运行),但我认为在这种情况下是有意义的……使用左外部联接而不是case-SELECT-IS NULL可以使查询更高效、更可读

接下来,您似乎正在尝试对百分比求和。不确定您希望返回哪种类型的数据,但AVG可能更合适?我想不出有什么实际的理由让你这么做

最后,APH的答案肯定会有效(假设您的原始查询有效),但考虑到您的查询的模糊性和低效性,我肯定会重写它


如果您有任何问题,请告诉我。

这是最简单和最简单的方法(如广告所示),但他的初始查询非常糟糕,我认为他最好重写它。这是最简单和最简单的方法(如广告所示),但他的初始查询非常糟糕,我认为他最好重写它。乘以1.0将
int
转换为
decimal
——我想这就是他使用它的原因,以避免整数除法。如果只除以
100.0
会更简单。这是正确的-我应该意识到这一点。然而,我认为为了清晰起见,最好使用强制转换或转换。乘以1.0将
int
转换为
decimal
——我假设这就是他使用它的原因,以避免整数除法。如果只除以
100.0
会更简单。这是正确的-我应该意识到这一点。然而,我认为如果这是目的的话,为了清晰起见最好是转换或转换。