在SQL中使用case表达式时如何使用标量值函数
这个问题给了我正确的答案。但问题在于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
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