我还是觉得你另外一个贴,要多个字段才更有意义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
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
是啊、
这种可以改成动态的么,不然新增一种种类 还是回头改sql
SET @SQL='SELECT T1.zymc'
SELECT @SQL=@SQL+',MAX(CASE WHEN T3.[name]='''+[name]+''' THEN T2.p_name END)['+[name]+']'
FROM Prj_OldDivisionOfWork --如果有重复就加 GROUP BY [name]
SET @SQL=@SQL+'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'
EXEC(@SQL)你调下,大概是这样
对,sql语句能查询出这样的结果么
,STUFF(
(SELECT ','+T2.p_name FROM Prj_OldProjectStaffArrange T1
JOIN SYS_Login T2 ON T1.ygbh=T2.Person_id
WHERE T1.fgbh=T3.bh)
,1,1,'')[p_name]
FROM Prj_OldDivisionOfWork T3
,STUFF(
(SELECT ','+T2.p_name FROM Prj_OldProjectStaffArrange T1
JOIN SYS_Login T2 ON T1.ygbh=T2.Person_id
WHERE T1.fgbh=T3.bh
FOR XML PATH(''))
,1,1,'')[p_name]
FROM Prj_OldDivisionOfWork T3
(
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