我有以下查询:
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聚合它。提前谢谢。
答案 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的答案肯定会起作用(假设您的原始查询有效),但考虑到查询的混淆和低效,我肯定会重写它。
如果您有任何疑问,请与我们联系。