2012-11-05 24 views
1

我已经查看了其他类似的问题,但我在查询中没有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 

回答

0

相近的查询

  1. 修复使用单引号的别名已被弃用。习惯于使用方括号,或者在别名正常时留下它们
  2. 当您已经使用SUM(CASE.. WHEN.. THEN 1 ELSE 0 END)时,CASE语句的性质是它永远不是NULL,所以用ISNULL包装是多余的。
  3. CASE的基本结构是CASE WHEN <condition> THEN <value>。这里的<condition>可以是任何表达式,甚至可以是多个比较。

修正并重新格式化查询:

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; 
0

该位的位置:

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

应该

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

吧?

1

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

这应该是

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

这是用于指定使用CASE化合物的条件的语法...当构建。

+1

说,除了第一'isnull'行语法错误做的'不正确的位置)'。 – Oded

+0

谢谢Vikdor,我应该认识到这一点!感谢Oded也。 – user1773949

0

你在错误的地方,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 
0

请在您的案件条件的变化:

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

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

相关问题