iif(cSignAttrib = '退货' ,SUM(FA_SignInfo.iAccountP),0 ) AS 退货,
把这句去掉就好了,可是我需要统计这个数字。
当 cSignAttrib 字段为 退货 的时候,我需要把 iAccountP 字段进行求和。
还能不能用其他方式实现呢?上面的语句在access里面通过,可是sql server 里面通过不了

解决方案 »

  1.   

    SQL Server 中使用Case when
    不支持iif()
      

  2.   

    sum(case cSignAttrib when '退货' then FA_SignInfo.iAccountP else 0)
      

  3.   

    SELECT 
        a.cDeptNo, 
        a.cClassNo, 
        a.cClassName, 
        a.istandard, 
        a.dStartTime, 
        a.dEndTime, 
        b.cSignAttrib, 
        SUM(b.iRatingP) AS iRatingP之Sum, 
        b.iInsertP, 
        SUM(b.iRebateP) AS iRebateP之Sum, 
        SUM(b.iAccountP) AS iAccountP之Sum, 
        SUM(b.iBackP) AS iBackP之Sum,
        SUM(case cSignAttrib when '退货' then b.iAccountP else 0 end) AS 退货,
        SUM(b.iRatingP) 
          - b.iInsertP - SUM(b.iRebateP) 
          - ISNULL(SUM(b.iBackP), 0) AS 非退货, 
        b.dSigTime
    FROM 
        dbo.BS_ClassInfo a
    INNER JOIN
        dbo.FA_SignInfo  b
    ON 
        a.cClassNo = b.cClassNo
    GROUP BY 
        a.cClassNo, a.cClassName, 
        a.istandard, a.dStartTime, 
        a.dEndTime, b.cSignAttrib, b.iInsertP, 
        b.dSigTime, a.cDeptNo
    having  
        a.dStartTime<='2006-1-31 23:00:00' AND a.dEndTime>='2006-1-1' AND b.cSignAttrib<>'转走' AND b.dSigTime<'2006-1-31 23:00:00'
      

  4.   

    --少了个end
    sum(case cSignAttrib when '退货' then FA_SignInfo.iAccountP else 0 end)
      

  5.   

    iif 是access中的,case when在sql server和ORACLE中都可以
      

  6.   

    不好意思,再顺便问一个问题,如果我想再加入一个条件做统计,这个条件该怎么写?就是对 iRebateP 这个字段进行判断,大于0的做一个计数,小于0的做一个计数,最后查询结果能显示 销售和退货的记录个数。我仿照刚才的 case 语句,可是还是写不好,大家再帮帮忙吧!
      

  7.   

    sum(case when iRebateP>0 then 1 else 0 end) AS 销售个数,
    sum(case when iRebateP<0 then 1 else 0 end) AS 退货个数