和成绩表需求有所不同的纵横转换。最近有这个纵横转换的需求,老样子,百度一下,找到n多网友奉献的脚本,非常感谢,但还不足以满足我的需要,潜心专研了sqlserver的帮助后,有了下面的收获,希望与广大程序员菜鸟共分享低手的快乐~
高手请飘过~
低手不要略过^_^
摘要:
和成绩表需求有所不同的纵横转换。最近有这个纵横转换的需求,老样子,百度一下,找到n多网友奉献的脚本,非常感谢,但还不足以满足我的需要,潜心专研了sqlserver的帮助后,有了下面的收获,希望与广大程序员菜鸟共分享低手的快乐~
说明:
成绩表纵横转换需求,科目是确定的,即使个别复杂拼动态sql的例子也不例外,也就是有多少科目,就会产生多少列;
我这里的需求是,用户工作过n家公司,但只要最近的3家公司名称,公司无数,无法用动态拼sql的方式解决,于是有了下面的方案。
另成绩表的方案,这里是链接http://blog.csdn.net/chqchq/archive/2008/05/22/2468980.aspx,这里就不多说了。
环境:
适用SQLserver2005及以上版本
测试脚本:

Code
--SQLServer数据库
--创建几个测试用临时表
--user#用户表,experience#用户工作经验表,result#为横表
IF NOT EXISTS (SELECT 1 FROM sysobjects WHERE NAME = 'user#')
CREATE TABLE user#(uid int, username varchar(50))
IF NOT EXISTS (SELECT 1 FROM sysobjects WHERE NAME = 'experience#')
CREATE TABLE experience#(uid int, company varchar(50))
IF NOT EXISTS (SELECT 1 FROM sysobjects WHERE NAME = 'result#')
CREATE TABLE result#(uid int, company1 varchar(50), company2 varchar(50), company3 varchar(50))

--插入测试数据
INSERT INTO user# VALUES(1, 'mike')
INSERT INTO user# VALUES(2, 'tom')
INSERT INTO user# VALUES(3, 'jerry')
INSERT INTO experience# VALUES(1, 'ibm')
INSERT INTO experience# VALUES(2, 'ibm')
INSERT INTO experience# VALUES(2, 'hp')
INSERT INTO experience# VALUES(3, 'ibm')
INSERT INTO experience# VALUES(2, 'sun')
INSERT INTO experience# VALUES(2, 'oracle')
INSERT INTO experience# VALUES(1, 'ibm')
INSERT INTO experience# VALUES(1, 'oracle')
INSERT INTO experience# VALUES(1, 'bea')


--这是中间结果,调试看看用
SELECT uid, company, row_number() OVER (PARTITION BY uid ORDER BY company desc) AS subindex FROM experience# group by uid, company


--转换
INSERT INTO result#
SELECT uid, MAX(CASE WHEN subindex = 1 THEN company ELSE null END) AS company1
, MAX(CASE WHEN subindex = 2 THEN company ELSE null END) AS company2
, MAX(CASE WHEN subindex = 3 THEN company ELSE null END) AS company3
FROM (
SELECT uid, company, row_number() OVER (PARTITION BY uid ORDER BY company desc) AS subindex FROM experience# group by uid, company
) AS t GROUP BY uid


--查看转换结果
SELECT * FROM result#

--删除临时表
DROP TABLE result#
DROP TABLE experience#
DROP TABLE user#
截图如下: