[英]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子句中)。 有任何想法吗? 这是我当前得到的输出:
我想通过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.