Как выполнить несколько пивотов на динамических столбцах - PullRequest
4 голосов
/ 13 мая 2019

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

Столбец «p.Parameter_1» недопустим в списке выбора. Образец таблицы

CREATE TABLE [dbo].[TrainingDetails](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Tid] [int] NOT NULL,
    [TrainingName] [nvarchar](50) NULL,
    [TDate] [nvarchar](50) NULL,
    [TPlace] [nvarchar](50) NULL,
    [Trainer] [nvarchar](50) NULL,
    [Facilitator] [nvarchar](50) NULL,
    [TrainingSubject] [nvarchar](50) NULL
) 


CREATE TABLE [dbo].[TrainngParticpntDtls](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Tid] [int] NOT NULL,
    [PName] [nvarchar](50) NULL,
    [PRank] [nvarchar](50) NULL
) 

Может кто-нибудь, пожалуйста, помогите

желаемый вывод,

enter image description here

Input enter image description here

Эта процедура до сих пор пробована.

DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)

SELECT 
   @cols = STUFF(
(
    SELECT DISTINCT 
           ',' + QUOTENAME('Parameter_' + CAST(ROW_NUMBER() OVER(PARTITION BY [td].[TrainingName]
                           ORDER BY 
                                    [td].[tid]) AS VARCHAR(10)))
         , +',' + QUOTENAME('Desig_' + CAST(ROW_NUMBER() OVER(PARTITION BY [td].[Tplace]
                            ORDER BY 
                                     [td].[tid]) AS VARCHAR(10)))
    FROM 
         [TrainingDetails] AS [td]
    INNER JOIN [dbo].[TrainngParticpntDtls] AS [pd] ON [td].[Tid] = [pd].[Tid]
    WHERE [td].[TID] = 1 FOR
    XML PATH(''), TYPE
) .value
('.', 'NVARCHAR(MAX)'
), 1, 1, '');
        --print @cols

set @query = 'SELECT 
   [Tplace]
 , [TrainingName]
 , [TrainingSubject]
 , [TDate]
 , [Facilitator]
 , ' + @cols + '
FROM
    (
        SELECT 
               [td].[Tplace]
             , [td].[TrainingName]
             , [td].[Trainingsubject]
             , [td].[TDate]
             , [td].[Facilitator]
             , [pd].[pname]
             , [pd].[pDesig]
             , ''Parameter_'' + CAST(ROW_NUMBER() OVER(PARTITION BY [td].[TrainingName]
               ORDER BY 
                        [td].[Tid]) AS NVARCHAR) AS [r]
             , ''Desig_'' + CAST(ROW_NUMBER() OVER(PARTITION BY [td].[Tplace]
               ORDER BY 
                        [td].[tid]) AS NVARCHAR) AS [rn]
        FROM 
             [TrainingDetails] AS [td]
        INNER JOIN [dbo].[TrainngParticpntDtls] AS [pd] ON [td].[Tid] = [pd].[Tid]
        WHERE [td].[TID] = 1
    ) AS [x] PIVOT(MAX([Pname]) FOR [r] IN(' + @cols + ')) [p] 
             PIVOT(MAX([pDesig]) FOR [rn] IN(' + @cols + ')) [pv2]
GROUP BY 
         [Tplace]
       , [TrainingName]
       , [TrainingSubject]
       , [TDate]
       , [Facilitator]
ORDER BY 
         [TrainingName]'
execute(@query);

вставить оператор для вышеуказанного вопроса это: -

INSERT INTO [dbo].[TrainingDetails] ([Tid],[TrainingName],[TDate],[TPlace],[Trainer],[Facilitator],[TrainingSubject])
     VALUES(1,'soft skills','31-03-2017','Webex','John','mary','Eng Grammer')

INSERT INTO [dbo].[TrainingDetails] ([Tid],[TrainingName],[TDate],[TPlace],[Trainer],[Facilitator],[TrainingSubject])
VALUES(2,'Managment skill','31-03-2017','Webex','smith','shah','ABC of Management')
GO
INSERT INTO [dbo].[TrainngParticpntDtls]([Tid],[PName],[PRank])VALUES(1,'pinto','SE')
INSERT INTO [dbo].[TrainngParticpntDtls]([Tid],[PName],[PRank])VALUES(1,'Jack','PM')
INSERT INTO [dbo].[TrainngParticpntDtls]([Tid],[PName],[PRank])VALUES(1,'harry','TL')
INSERT INTO [dbo].[TrainngParticpntDtls]([Tid],[PName],[PRank])VALUES(1,'Rosy','HR')
GO    
INSERT INTO [dbo].[TrainngParticpntDtls]([Tid],[PName],[PRank])VALUES(2,'steve','Account')
INSERT INTO [dbo].[TrainngParticpntDtls]([Tid],[PName],[PRank])VALUES(2,'rony','DBA')
INSERT INTO [dbo].[TrainngParticpntDtls]([Tid],[PName],[PRank])VALUES(2,'logan','PM')
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...