SQL嵌入式案例
我是Sql新手。那些没有IF条件的表的逻辑总是让我恼火。我有一张桌子,我的桌子是这样的: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
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,也可以不使用子查询来执行它,以使其更可读,因为您有其他代码使用它,我将它保存在子查询中