首页 新闻 会员 周边 捐助

ms sql server 数据库 多行转化为 一行

0
悬赏园豆:100 [已解决问题] 解决于 2013-12-09 14:18

上面是一个表,就是说每个省市可能有(可能列出3种,可能一种都没有)三种类型recruitType,每个类型对应一个companySum,我想得到下面的表:

[provinceId],[provinceName],[type1Sum],[type2Sum],[type3Sum]

上面是表头,就是说把图片所示的表如果有行的provinceId一样就放到一行去,而不是很多行

可以用存储过程实现吗?

简单的信仰的主页 简单的信仰 | 初学一级 | 园豆:3
提问于:2013-12-08 12:29
< >
分享
最佳答案
1

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]

收获园豆:80
Albert Fei | 老鸟四级 |园豆:2102 | 2013-12-09 10:52

谢谢你!果真可以解决!

但是我有一事不明:sum()里面的then companySum 什么意思?我知道是一个case语句

简单的信仰 | 园豆:3 (初学一级) | 2013-12-09 12:09

@简单的信仰: 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

Albert Fei | 园豆:2102 (老鸟四级) | 2013-12-09 13:22
其他回答(4)
0

楼主的基础数据和业务数据混了  

可以拆分为两个表:

表1    [provinceId],[provinceName]

表2    [provinceId],,[typeSum],[CompanySum]

这样个人认为这样不错

 

但楼主如果执意要 混在一起 

可以设计成这样:

[provinceId],[provinceName],[recruitTypeAndCompanySum]

其中recruitTypeAndCompanySum是字符型, recruitType=1:companySum=8||recruitType=2:companySum=5

以字符形式拼接起来 ,修改起来可能略麻烦

tianxiaozz | 园豆:322 (菜鸟二级) | 2013-12-08 13:53
1

标准的行列转换吧,在SQL05+采用Pivot关键字:

SELECT * FROM T
PIVOT
(
    MAX(companySum) FOR reciuitType IN ([1],[2],[3])
) AS t
收获园豆:20
幻天芒 | 园豆:37207 (高人七级) | 2013-12-08 18:10
0
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


楼主试一下看?

I,Robot | 园豆:9783 (大侠五级) | 2013-12-09 00:20
1
li-peng | 园豆:954 (小虾三级) | 2013-12-09 12:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册