SQL嵌入式案例

SQL嵌入式案例,sql,case,Sql,Case,我是Sql新手。那些没有IF条件的表的逻辑总是让我恼火。我有一张桌子,我的桌子是这样的: ID ProjectID ClassType ClassYear Amount 1 1 A 2014 0.00 2 1 A 2014 0.00 3 1 B 2014 300.00 5 1 B 2013 100.00 6 1 C 2015 200.00 7 1 A 2013 0.00 8 1

我是Sql新手。那些没有IF条件的表的逻辑总是让我恼火。我有一张桌子,我的桌子是这样的:

ID ProjectID ClassType  ClassYear Amount
1   1   A   2014    0.00
2   1   A   2014    0.00
3   1   B   2014    300.00
5   1   B   2013    100.00
6   1   C   2015    200.00
7   1   A   2013    0.00
8   1   B   2015    200.00
9   1   B   2014    500.00
11  1   B   2015    230.00
....
我的原始代码如下,工作正常:

Some code 
from 
(
    Select projectID, sum(currentyear) as CurrentYear, sum(prioryear) as PriorYear, sum(postyear) as PostYear
    from 
        (select ProjectID, 
            case when Classyear = 2014 then Amount else 0 end as currentyear,
            case when ClassYear <2014 then Amount else 0 end as prioryear,
            case when ClassYear > 2014 then Amount else 0 end as postyear 
            from MyTable
            where classtype = 'A'
         ) as subtable
    group by subtable.ProjectID
)
现在我想为上面的类类型添加更多选项,但不知道如何添加。逻辑应该是:

换句话说,如果项目中类类型A的总金额为0,则这三个数字都为0,此时where条件应更改为类类型='B'。如果类类型B仍然都是0,则使用类类型C。如果C仍然是0,则可以

我应该把新的病例条件放在哪里

我们可以使用GROUP BY获得每个类类型的总计,然后过滤适当的值

 SELECT * 
FROM
(
select *, ROW_NUMBER() over ( partition by projectId order by classType) as seq FROM
(
    Select projectID, classType, sum(Amount) as Total, 
           sum(case when Classyear = 2014 then Amount else 0 end) as CurrentYear, 
           sum(case when ClassYear <2014 then Amount else 0 end) as PriorYear, 
           sum( case when ClassYear > 2014 then Amount else 0 end) as PostYear

    from 
    myTable
    group by ProjectID, classType
) T
Where (T.Total >0 and classType <> 'C') or classType ='C' 
) C
where seq =1

你是天才。看来我得把语言编码改成SQL了。他们完全不同。非常感谢,Radar.Ops,实际上它只对一个Projectd有效,我想收集所有Projectd。在这种情况下不起作用。@user3191850,你能再解释一下吗?ProjectID可以是2,3。。我需要列出每个项目的所有数据。上面的代码只列出了第一个项目。@user3191850,更新了答案,您可以使用CTE,也可以不使用子查询来执行它,以使其更可读,因为您有其他代码使用它,我将它保存在子查询中