如何在SQL

时间:2018-04-24 08:50:49

标签: sql sql-server tsql

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

1 个答案:

答案 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...

目前执行的显式轮播