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)