Хранимая процедура (динамические столбцы в SQL SERVER 2008) - PullRequest
1 голос
/ 20 октября 2011

У меня 3 таблицы Project departments и projectStatus

Отдел

ID          Name
1         Software
2           XML1
.            .
.            .

Проект

ID       Name        DeptID   StatusID
1        Prj1           1        1
2        prj2           2        2
.         .             .        .
.         .             .        .

projectStatus

ID      Name
1       InProgress
2       Pending
.         .
.         .

Хочу комбинацию ниже:
enter image description here

Я пробовал это

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   

Здесь я хочу, чтобы количество столбцов получалось динамически в зависимости от количества отделов. Заранее спасибо ...

Edit: Решение

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)

1 Ответ

0 голосов
/ 16 ноября 2011

У меня замечательный пост об этом. Я ссылался на эту ссылку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...