首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SQL中case when表达式中使用标量值函数

如何在SQL中case when表达式中使用标量值函数
EN

Stack Overflow用户
提问于 2018-04-24 16:50:49
回答 1查看 274关注 0票数 0
代码语言:javascript
复制
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

这个查询给了我正确的答案。但问题出在case表达式中。我的变量是动态的,可以更改。所以我创建了一个包含子状态和基本状态的表

这是我桌子的一部分

代码语言:javascript
复制
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
.
.
.

为此,我尝试使用子查询,如下所示。

代码语言:javascript
复制
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

它会给出有关“无法对包含聚合或子查询表达式执行聚合函数”的错误。

我做了一个返回值的函数,比如‘不在办公室’,‘在度假’。我的函数如下

代码语言:javascript
复制
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

通常,当我使用Normally作为列时,它返回的结果与Total Out的'Out of office','On returning‘相同。但是,当我尝试写入IN时,同样的错误不能在包含聚合或子查询的表达式上执行聚合函数。

如何在SUM(CASE WHEN( logic )) <--逻辑中使用子查询或函数

EN

回答 1

Stack Overflow用户

发布于 2018-04-24 16:56:08

与其尝试使用子查询或函数,为什么不使用连接

代码语言:javascript
复制
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...执行的显式旋转

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49997272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档