Sql server 2008 存储过程(SQL SERVER 2008中的动态列)

Sql server 2008 存储过程(SQL SERVER 2008中的动态列),sql-server-2008,stored-procedures,Sql Server 2008,Stored Procedures,我有三个表项目部门和项目状态 系 计划 项目状态 我想要下面的组合: 我试过这个 SELECT Status=[Name], Software=( SELECT COUNT(*) FROM Projects WHERE StatusID=PS.ID and DeptI =1 ), XML1=( SELECT COUNT(*) FROM Projects WHER

我有三个表
项目
部门
项目状态

计划

项目状态

我想要下面的组合:

我试过这个

SELECT 
    Status=[Name],
    Software=(
        SELECT COUNT(*)
        FROM Projects 
        WHERE StatusID=PS.ID and DeptI =1
    ),
    XML1=( 
        SELECT COUNT(*)
        FROM Projects
        WHERE CurrentStatusID=PS.ID and DeptID=2
    ),
    Imaging=(
        SELECT COUNT(*)
        FROM Projects
        WHERE CurrentStatusID=PS.ID and DeptID =3
    )  
FROM
    [MIS_STORE].[dbo].[M_ProjectStatuses] PS   
在这里,我希望根据部门的数量动态检索列的数量。 先谢谢你

编辑:解决方案

DECLARE @cols NVARCHAR(2000);
DECLARE @query NVARCHAR(4000);


SELECT  @cols = COALESCE(@cols + ',[' + Name + ']',
                         '[' + Name + ']')
FROM    M_Departments 
ORDER BY Name


SET @query = 'SELECT [Status], '+
@cols +'
FROM
(SELECT Projects.Name, 
M_Departments.Name AS dept, 
M_ProjectStatuses.Name AS [Status]
FROM     Projects INNER JOIN
         M_Departments ON Projects.M_DeptID = M_Departments.ID INNER JOIN
         M_ProjectStatuses ON Projects.CurrentStatusID = M_ProjectStatuses.ID) test
 PIVOT
(
count(name)
FOR dept IN
( '+ @cols +')) p '
EXECUTE(@query)
ID      Name
1       InProgress
2       Pending
.         .
.         .
SELECT 
    Status=[Name],
    Software=(
        SELECT COUNT(*)
        FROM Projects 
        WHERE StatusID=PS.ID and DeptI =1
    ),
    XML1=( 
        SELECT COUNT(*)
        FROM Projects
        WHERE CurrentStatusID=PS.ID and DeptID=2
    ),
    Imaging=(
        SELECT COUNT(*)
        FROM Projects
        WHERE CurrentStatusID=PS.ID and DeptID =3
    )  
FROM
    [MIS_STORE].[dbo].[M_ProjectStatuses] PS   
DECLARE @cols NVARCHAR(2000);
DECLARE @query NVARCHAR(4000);


SELECT  @cols = COALESCE(@cols + ',[' + Name + ']',
                         '[' + Name + ']')
FROM    M_Departments 
ORDER BY Name


SET @query = 'SELECT [Status], '+
@cols +'
FROM
(SELECT Projects.Name, 
M_Departments.Name AS dept, 
M_ProjectStatuses.Name AS [Status]
FROM     Projects INNER JOIN
         M_Departments ON Projects.M_DeptID = M_Departments.ID INNER JOIN
         M_ProjectStatuses ON Projects.CurrentStatusID = M_ProjectStatuses.ID) test
 PIVOT
(
count(name)
FOR dept IN
( '+ @cols +')) p '
EXECUTE(@query)