带子查询Sql语句的嵌套Case语句的正确结构是什么?
这里有一个复杂的查询,其中嵌套了case和subquery。我很难找到它的正确结构。这是我的密码:带子查询Sql语句的嵌套Case语句的正确结构是什么?,sql,sql-server,nested,subquery,case,Sql,Sql Server,Nested,Subquery,Case,这里有一个复杂的查询,其中嵌套了case和subquery。我很难找到它的正确结构。这是我的密码: select AccountNo, Case when Datepart (month,TranDate) = 1 Then Case ISNULL(RemainingBalance,'NULLVALUE') When 'NULLVALUE' Then (select top 1 RemainingBalance From tempAccountBala
select
AccountNo,
Case when Datepart (month,TranDate) = 1 Then
Case ISNULL(RemainingBalance,'NULLVALUE')
When 'NULLVALUE' Then
(select top 1 RemainingBalance From tempAccountBalance
where DATEPART (YEAR,TranDate)=@FiscalYear-1
order by TranDate desc)
else
MIN(Case when Datepart (month,TranDate) <= 3 Then
RemainingBalance END) End Q1
FROM tempAccountBalance
WHERE Datepart (year,TranDate) = @FiscalYear and AccountNo=@AccountNo
Group By AccountNo
我得到一个错误,上面写着,Msg 102,15级,状态1,第11行
“Q1”附近的语法不正确。在Q1之前需要结束:
select
AccountNo,
Case when Datepart (month,TranDate) = 1 Then
Case ISNULL(RemainingBalance,'NULLVALUE')
When 'NULLVALUE' Then
(select top 1 RemainingBalance From tempAccountBalance
where DATEPART (YEAR,TranDate)=@FiscalYear-1
order by TranDate desc)
else
MIN(Case when Datepart (month,TranDate) <= 3 Then
RemainingBalance END) End End Q1
FROM tempAccountBalance
WHERE Datepart (year,TranDate) = @FiscalYear and AccountNo=@AccountNo
Group By AccountNo
如果缩进代码,您将更容易在下面发现类似这样的错误。但是请注意,您的查询仍然存在分组问题-您需要将TranDate和RemainingBalance添加到GROUP BY,或者对它们使用聚合。我在不理解您的问题的情况下进行了以下猜测:
select
AccountNo,
Case
when Datepart(month,TranDate) = 1
Then
Case ISNULL(Min(RemainingBalance), 'NULLVALUE') -- Added Min
When 'NULLVALUE'
Then (select top 1 RemainingBalance From tempAccountBalance
where DATEPART (YEAR,TranDate)=@FiscalYear-1
order by TranDate desc)
else
MIN(
Case
when Datepart (month,TranDate) <= 3
Then RemainingBalance
END)
end -- Missing
End Q1
FROM tempAccountBalance
WHERE Datepart(year,TranDate) = @FiscalYear and AccountNo=@AccountNo
Group By AccountNo, Datepart(month,TranDate); -- Added to Group By
我想指出的是,此查询不需要嵌套的case语句:
select AccountNo,
(Case when Datepart(month, TranDate) = 1 and
RemainingBalance is null
Then (select top 1 RemainingBalance
From tempAccountBalance
where DATEPART(YEAR, TranDate) = @FiscalYear-1
order by TranDate desc
)
when Datepart(month, TranDate) = 1
then MIN(Case when Datepart(month, TranDate) <= 3 Then RemainingBalance END)
End) as Q1
FROM tempAccountBalance
WHERE Datepart(year,TranDate) = @FiscalYear and AccountNo=@AccountNo
Group By AccountNo;
适当的缩进可能会更明显地突出缺少的一端。。。您有三个CASE这个词的实例,只有两个END这个词的实例,所以其中一个没有终止。谢谢。它确实有效。我将重新编辑我的问题以添加一些后续内容。