SELECT a.UserID,
Sum(Case when UserStatus IN('Out of office','On vacation') then ... ELSE 0 END) as 'Total Out',
Sum(Case when UserStatus IN('Project X','Project Y','Project Z') then ... ELSE 0 END) as 'Total Project'
FROM UserLog a
WHERE a.DateColumn between @start AND @end GROUP BY a.UserID
此查询给出了正确的答案。但问题是表达式。我的变量是动态的,可以改变。所以我创建了一个具有子状态和基本状态的表
这是我表格的一部分
BaseState Substate
Total Out | Out of office
Total Out | On vacation
Total In | Project X
Total In | Project Y
Total In | Project Z
Total UK | Project X
Total UK | Project Y
.
.
.
我尝试使用子查询,如下所示。
SELECT a.UserID,
Sum(Case when UserStatus IN(Select Substate FROM StateTable WHERE BaseState = 'Total Out') then ... ELSE 0 END) as 'Total Out',
Sum(Case when UserStatus IN(Select Substate FROM StateTable WHERE BaseState = 'Total In') then ... ELSE 0 END) as 'Total In'
FROM UserLog a
WHERE a.DateColumn between @start AND @end GROUP BY a.UserID
它给出了“无法对包含聚合或子查询的表达式执行聚合函数”的错误。
我做了一个函数,将值返回为“不在办公室”,“休假”。我的功能在
之下USE [AgentPerformance]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[fn_Status]
(
@gelen varchar(50)
)
RETURNS NVARCHAR(200)
AS
BEGIN
DECLARE @donen NVARCHAR(200);
Select @donen = Left(Main.[SubState],Len(Main.[SubState])-1)
From
(
Select distinct ST2.BaseStateName,
(
Select ''''+RTRIM(ST1.SubStateName)+'''' + ',' AS [text()]
From dbo.[SubState] ST1
Where ST1.BaseStateName = ST2.BaseStateName
ORDER BY ST1.BaseStateName
For XML PATH ('')
) [SubState]
From dbo.[SubState] ST2
) [Main] WHERE BaseStateName = @gelen
RETURN @donen;
END
正常情况下,当我正常使用作为列时,它会返回与“Out of office”,“On Vacation”相同的Total Out。但是,当我尝试写入IN时,它会发出相同的错误。无法对包含聚合或子查询的表达式执行聚合函数。
如何在SUM中使用子查询或函数(CASE WHEN(逻辑))< - logic
答案 0 :(得分:0)
为什么不使用 join ,而不是尝试使用子查询或函数:
SELECT a.UserID,
Sum(Case when st.BaseState = 'Total Out' then ... ELSE 0 END) as 'Total Out',
Sum(Case when st.BaseState = 'Total In' then ... ELSE 0 END) as 'Total In'
FROM UserLog a
INNER JOIN StateTable st
ON a.UserStatus = st.Substate
WHERE a.DateColumn between @start AND @end
GROUP BY a.UserID
此时您可能还想考虑是否使用PIVOT
来进一步简化这一过程,而不是通过SUM(CASE...