Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中使用case表达式时如何使用标量值函数_Sql_Sql Server_Tsql - Fatal编程技术网

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

在SQL中使用case表达式时如何使用标量值函数,sql,sql-server,tsql,Sql,Sql Server,Tsql,这个问题给了我正确的答案。但问题在于case表达式。我的变量是动态的,可以更改。所以我创建了一个包含子状态和基本状态的表 这是我桌子的一部分 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') t

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

这是我桌子的一部分

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
通常情况下,它返回的值与“外出”相同,“休假”返回的值与我通常使用的列相同。但是,当我试图在其中写入gaves时,同样的错误是无法对包含聚合或子查询的表达式执行聚合函数


如何在SUM(CASE WHEN(logic))中使用子查询或函数,而不是尝试使用子查询或函数,为什么不使用联接:


在此,您还可能想考虑是否使用<代码> PIVOT < /C> >在当前通过“代码>和”执行的显式枢转中进一步简化这一点。(CASE…

如果一个基本状态下有多个子状态呢?我在问题u中编辑我的表格,你可以检查..思考如果status=Project X我怎么才能得到正确的值?@EnderAriç-什么让你认为它会失败?然后将
UserLog
Project X
的任何一行连接到
StateTable
表格中分组前的结果集中有两个结果。其中一个结果将在中包含
Total,另一个结果将在
中包含
Total UK
,并且每个结果都将贡献相应的
总和()
expression.I我的状态是ProjectX,它必须使用Total In和Total Uk进行计算。但它只获取表中的第一行。我可以使用此选项计算ProjectX在Total Uk的数据condition@EnderAri抱歉,我不明白你想描述的是什么问题。也许如果你添加一些样本数据和预期结果这会让问题更清楚吗?(当然,了解您的
案例
表达式中的
..
也会有所帮助)
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
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