当前位置: 代码迷 >> Sql Server >> sql 2008 行转列 求教,该怎么解决
  详细解决方案

sql 2008 行转列 求教,该怎么解决

热度:73   发布时间:2016-04-24 09:26:30.0
sql 2008 行转列 求教
这是现在的查询语句与查询结果

select  yg.p_name,fg.name from Prj_OldProjectStaffArrange ap  
 left join SYS_Login yg on ap.ygbh=yg.Person_id  
 left join  Prj_OldDivisionOfWork fg on ap.fgbh=fg.bh
   where ap.ywbh ='N06-a-001';
 

想要实现这样子:
        设计      审核          校对       项目负责人
        余华刚    明伟华     吴祖磊     叶青
        陈浩       陈雄志      高艳
        郭宏         汪勰       朱娟
------解决思路----------------------
我还是觉得你另外一个贴,要多个字段才更有意义
SELECT
T1.zymc
,MAX(CASE T3.[name] WHEN '审核'THEN T2.p_name END)[审核]
,MAX(CASE T3.[name] WHEN '校对'THEN T2.p_name END)[校对]
,MAX(CASE T3.[name] WHEN '项目负责人'THEN T2.p_name END)[项目负责人]
FROM Prj_OldProjectStaffArrange T1
LEFT JOIN SYS_Login T2 ON T1.ygbh=T2.Person_id
LEFT JOIN Prj_OldDivisionOfWork T3 on T1.fgbh=T3.bh
WHERE T1.ywbh ='N06-a-001';
GROUP BY T1.zymc

------解决思路----------------------
楼主一楼的需求完全可以实现啊,动态的pivot就OK. 参照如下例子.

CREATE TABLE tbl
(
p_name VARCHAR(99),
name VARCHAR(99)
);
INSERT INTO tbl VALUES(N'叶青',N'项目负责人'),(N'陈雄志',N'审核'),(N'明伟华',N'审核'),(N'高艳',N'校对'),(N'陈浩',N'设计'),(N'吴祖磊',N'校对'),(N'郭宏',N'设计'),(N'余华刚',N'设计'),(N'朱娟',N'校对'),(N'汪勰',N'审核');


DECLARE @selectNames VARCHAR(MAX);
SELECT @selectNames = ISNULL(@selectNames+',','')+N'ISNULL('+QUOTENAME(columnName)+N','''') AS '+QUOTENAME(columnName) FROM(SELECT DISTINCT name AS columnName FROM tbl) t;

DECLARE @pivotNames VARCHAR(MAX);  
SELECT @pivotNames= ISNULL(@pivotNames+',','')+QUOTENAME(columnName) FROM(SELECT DISTINCT name AS columnName FROM tbl) t;


DECLARE @sqlStr NVARCHAR(MAX)=N'
;WITH CTE AS
(
SELECT *,ROW_NUMBER() OVER(PARTITION BY name order by p_name) as rn FROM tbl
)
SELECT #selectColumns# FROM CTE 
PIVOT
(
MAX(p_name) FOR NAME IN (#pivotcolumns#)
)AS pivTbl';

SELECT @sqlStr = REPLACE(REPLACE(@sqlStr,N'#pivotcolumns#',@pivotNames),N'#selectColumns#',@selectNames);
SELECT @sqlStr
EXEC sp_executesql @sqlStr;
/*
设计 审核 项目负责人 校对
陈浩 陈雄志 叶青 高艳
郭宏 明伟华 吴祖磊
余华刚 汪勰 朱娟
*/


回到你具体的需求,只需要把你的query改下替换到上面例子中的CTE中即可
select  yg.p_name,fg.name,row_number() over(partition by fg.name order by yg.p_name) from Prj_OldProjectStaffArrange ap  
 left join SYS_Login yg on ap.ygbh=yg.Person_id  
 left join  Prj_OldDivisionOfWork fg on ap.fgbh=fg.bh
   where ap.ywbh ='N06-a-001';


p.s.
PIVOT 请参照 http://msdn.microsoft.com/zh-tw/library/ms177410.aspx

  相关解决方案