上面是一个表,就是说每个省市可能有(可能列出3种,可能一种都没有)三种类型recruitType,每个类型对应一个companySum,我想得到下面的表:
[provinceId],[provinceName],[type1Sum],[type2Sum],[type3Sum]
上面是表头,就是说把图片所示的表如果有行的provinceId一样就放到一行去,而不是很多行
可以用存储过程实现吗?
PIVOT 这个函数局限性太大.
一般sql写法如下:
select [provinceId],[provinceName]
,sum(case recruitType when 1 then companySum end) as [type1Sum]
,sum(case recruitType when 2 then companySum end) as [type2Sum]
,sum(case recruitType when 3 then companySum end) as [type3Sum]
from T
group by [provinceId],[provinceName]
谢谢你!果真可以解决!
但是我有一事不明:sum()里面的then companySum 什么意思?我知道是一个case语句
@简单的信仰: case recruitType when 1 then companySum end
中的companySum就是你要统计的companySum字段,因为
,sum(case recruitType when 1 then companySum end) as [type1Sum]
,sum(case recruitType when 2 then companySum end) as [type2Sum]
,sum(case recruitType when 3 then companySum end) as [type3Sum]
这是三句,也就是把三个值(recruitType值)分开成三个类型:recruitType1,recruitType2,recruitType3,把每个类型对应的值
所以case recruitType when 1 then companySum end意思就是当recruitType=1时,取companySum的值,其它值(2,3)时不处理,在其它二句中处理。
你执行下面这句看看也许会更明白一些
select [provinceId],[provinceName]
,case recruitType when 1 then companySum end as [type1Sum]
,case recruitType when 2 then companySum end as [type2Sum]
,case recruitType when 3 then companySum end as [type3Sum]
from T
楼主的基础数据和业务数据混了
可以拆分为两个表:
表1 [provinceId],[provinceName]
表2 [provinceId],,[typeSum],[CompanySum]
这样个人认为这样不错
但楼主如果执意要 混在一起
可以设计成这样:
[provinceId],[provinceName],[recruitTypeAndCompanySum]
其中recruitTypeAndCompanySum是字符型, recruitType=1:companySum=8||recruitType=2:companySum=5
以字符形式拼接起来 ,修改起来可能略麻烦
标准的行列转换吧,在SQL05+采用Pivot关键字:
SELECT * FROM T PIVOT ( MAX(companySum) FOR reciuitType IN ([1],[2],[3]) ) AS t
SELECT A.*,(SELECT companySum FROM table WHERE provinceId = A.provinceId AND recruitType = 1) type1Sum,(SELECT companySum FROM table WHERE provinceId = A.provinceId AND recruitType = 2) type2Sum,(SELECT companySum FROM table WHERE provinceId = A.provinceId AND recruitType = 3) type3Sum FROM (SELECT DISTINCT provinceId,provinceName FROM table) A
楼主试一下看?