Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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_Nested_Subquery_Case - Fatal编程技术网

带子查询Sql语句的嵌套Case语句的正确结构是什么?

带子查询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

这里有一个复杂的查询,其中嵌套了case和subquery。我很难找到它的正确结构。这是我的密码:

 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这个词的实例,所以其中一个没有终止。谢谢。它确实有效。我将重新编辑我的问题以添加一些后续内容。