【问题标题】:An expression of non-boolean type specified in a context where a condition is expected, near ','在预期条件的上下文中指定的非布尔类型的表达式,靠近“,”
【发布时间】:2012-11-05 09:50:48
【问题描述】:

我已经查看了其他类似的问题,但是我的查询中没有Where 子句,这让我对如何解决它感到有些困惑。

INSERT INTO #tmpCombined  
SELECT A.Region  
    , 'MyLocation' AS 'Location'  
    , c.Id AS 'CompID'  
    , c.Name AS 'CompName'  
    , 'Cash' AS 'Context'  
    , isnull( sum( CASE WHEN T.TranAge >= 0 and CASE WHEN T.TranAge < 1 THEN 1 ELSE 0 END,0 )) AS 'ZeroDays0'  
    , isnull( sum( CASE WHEN T.TranAge >= 1 and CASE WHEN T.TranAge < 8 THEN 1 ELSE 0 END ), 0 ) AS '1to7Days'  
    , isnull( sum( CASE WHEN T.TranAge >=  8 and CASE WHEN T.TranAge < 16 THEN 1 ELSE 0 END ), 0 ) AS '8to15Days'  
    , isnull( sum( CASE WHEN T.TranAge >=  16 and CASE WHEN T.TranAge < 20 THEN 1 ELSE 0 END ), 0 ) AS '16to20Days'  
    , isnull( sum( CASE WHEN T.TranAge >=  20 THEN 1 ELSE 0 END ), 0 ) AS '20DaysPlus'  
    , COUNT(1) AS 'Total'  
    , A.Level as 'Level'  
    , sum(T.USDDifference) AS 'USDRevaluation'  
    from MyLocation.dbo.Company C  
    inner join #tmpCashTBResults T on T.CompanyId = C.Id  
    inner join #tmpCashAccounts A on T.CompanyId = A.CompanyId  
    group by A.Region, C.Id, C.Name, A.Level  

【问题讨论】:

    标签: sql sql-server-2008


    【解决方案1】:

    CASE WHEN T.TranAge >= 0 和 CASE WHEN T.TranAge

    这应该是

     CASE 
        WHEN T.TranAge >= 0 and T.TranAge < 1 THEN 1
     ...
    

    这是使用 CASE ... WHEN 构造指定复合条件的语法。

    【讨论】:

    • 这以及第一行 isnull 上的语法错误与 ) 的位置不正确有关。
    • 感谢 Vikdor,我应该意识到这一点!也感谢 Oded。
    【解决方案2】:

    在您的查询中需要解决的问题

    1. 不推荐使用单引号别名。习惯使用方括号,或者当别名没问题时离开它们
    2. 当您已经在使用 SUM(CASE.. WHEN.. THEN 1 ELSE 0 END) 时,CASE 语句的本质是它永远不会为 NULL,因此用 ISNULL 包装它是多余的。
    3. CASE的基本结构是CASE WHEN &lt;condition&gt; THEN &lt;value&gt;。这里的&lt;condition&gt; 可以是任意表达式,甚至可以是多重比较。

    更正和重新格式化的查询:

      INSERT INTO #tmpCombined  
      SELECT A.Region  
           , 'MyLocation' AS Location  
           , c.Id AS CompID  
           , c.Name AS CompName  
           , 'Cash' AS Context  
           , sum( CASE WHEN T.TranAge >= 0 and T.TranAge < 1 THEN 1 ELSE 0 END) AS ZeroDays0  
           , sum( CASE WHEN T.TranAge >= 1 and T.TranAge < 8 THEN 1 ELSE 0 END) AS [1to7Days]  
           , sum( CASE WHEN T.TranAge >= 8 and T.TranAge < 16 THEN 1 ELSE 0 END) AS [8to15Days]  
           , sum( CASE WHEN T.TranAge >= 16 and T.TranAge < 20 THEN 1 ELSE 0 END) AS [16to20Days]  
           , sum( CASE WHEN T.TranAge >= 20 THEN 1 ELSE 0 END) AS [20DaysPlus]  
           , COUNT(1) AS Total  
           , A.Level as Level  
           , sum(T.USDDifference) AS USDRevaluation  
        from MyLocation.dbo.Company C  
        join #tmpCashTBResults T on T.CompanyId = C.Id  
        join #tmpCashAccounts A on T.CompanyId = A.CompanyId  
    group by A.Region, C.Id, C.Name, A.Level;
    

    【讨论】:

      【解决方案3】:

      这里有点:

      THEN 1 ELSE 0 END,0 )) AS 'ZeroDays0'
      

      应该是

      THEN 1 ELSE 0 END) ,0 ) AS 'ZeroDays0'
      

      也许?

      【讨论】:

        【解决方案4】:

        请更改您的案例条件:

        , isnull( sum( CASE WHEN T.TranAge >= 0 and T.TranAge < 1 THEN 1 ELSE 0 END ),0) AS 'ZeroDays0'  
        

        【讨论】:

          【解决方案5】:

          对于 ZeroDays0 列,您将 ,0 作为 SUM 函数的参数传递,而不是 ISNULL。

          【讨论】:

            【解决方案6】:

            ,0这里放错地方了,改一下:

            isnull( sum( CASE WHEN T.TranAge >= 0 and CASE WHEN T.TranAge < 1 THEN 1 ELSE 0 END,0 ))
            

            到:

            isnull( sum( CASE WHEN T.TranAge >= 0 and CASE WHEN T.TranAge < 1 THEN 1 ELSE 0 END), 0)
            

            另外,您的case 语句是错误的,条件中不应该有另一个case。改变那些看起来像这样的;

            CASE WHEN T.TranAge >= 0 and CASE WHEN T.TranAge < 1 THEN 1 ELSE 0 END
            

            到:

            CASE WHEN T.TranAge >= 0 and T.TranAge < 1 THEN 1 ELSE 0 END
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-10-23
              • 1970-01-01
              • 2011-09-22
              • 2013-02-11
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多