PIVOT не выдает данные по одной строке - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь написать PIVOT, чтобы сгенерировать строку данных, которая изначально находится как несколько строк в БД.Данные БД выглядят так (добавлено)

txtSchoolID txtSubjectArchivedName  intSubjectID    intGradeID  intGradeTransposeValue
95406288448    History                  7             634           2
95406288448    History                  7             635           2
95406288448    History                  7             636           2
95406288448    History                  7             637           2
95406288448    History                  7             638           2
95406288448    History                  7             639           2
95406288448    History                  7             640           2
95406288448    History                  7             641           2
95406288448    History                  7             642           2
95406288448    History                  7             643           2

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

Я написал следующееpivot:

SELECT        intSubjectID, txtSchoolID, [636] AS Effort, [637] AS Focus, [638] AS Participation, [639] AS Groupwork, [640] AS Rigour, [641] AS Curiosity, [642] AS Initiative,
                [643] AS SelfOrganisation, [644] as Perserverance               
FROM         (SELECT txtSchoolID, intReportTypeID, txtSubjectArchivedName, intSubjectID, intReportProgress, txtTitle, txtForename, txtPreName, txtMiddleNames, 
                txtSurname, txtGender, txtForm, intNCYear, txtSubmitByTitle, txtSubmitByPreName, txtSubmitByFirstname, txtSubmitByMiddleNames, 
                txtSubmitBySurname, txtCurrentSubjectName, txtCurrentSubjectReportName, intReportCycleID, txtReportCycleName, intReportCycleType, 
                intPreviousReportCycle, txtReportCycleShortName, intReportCycleTerm, intReportCycleAcademicYear, dtReportCycleStartDate, 
                dtReportCycleFinishDate, dtReportCyclePrintDate, txtReportTermName, dtReportTermStartDate, dtReportTermFinishDate,  
                intGradeID, txtGradingName, txtGradingOptions, txtShortGradingName, txtGrade, intGradeTransposeValue FROM VwReportsManagementAcademicReports) p
PIVOT
(MAX        (intGradeTransposeValue)
FOR intGradeID IN ([636], [637], [638], [639], [640], [641], [642], [643], [644] )
) AS pvt
WHERE        (intReportCycleID = 142) AND (intReportProgress = 1)

Тем не менее, это производит это

intSubjectID    txtSchoolID Effort  Focus   Participation   Groupwork   Rigour  Curiosity   Initiative  SelfOrganisation    Perserverance
8   74001484142 NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
8   74001484142 NULL    NULL    NULL    NULL    NULL    2   NULL    NULL    NULL
8   74001484142 3   NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
8   74001484142 NULL    2   NULL    NULL    NULL    NULL    NULL    NULL    NULL
8   74001484142 NULL    NULL    NULL    2   NULL    NULL    NULL    NULL    NULL
8   74001484142 NULL    NULL    NULL    NULL    NULL    NULL    2   NULL    NULL
8   74001484142 NULL    NULL    2   NULL    NULL    NULL    NULL    NULL    NULL
8   74001484142 NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    2
8   74001484142 NULL    NULL    NULL    NULL    2   NULL    NULL    NULL    NULL
8   74001484142 NULL    NULL    NULL    NULL    NULL    NULL    NULL    2   NULL

Что я хочу, это

intSubjectID    txtSchoolID Effort  Focus   Participation   Groupwork   Rigour  Curiosity   Initiative  SelfOrganisation    Perserverance
8               74001484142  3       2            2           2            2        2       2              2                          2

Есть ли способ получить это так.

Я никогда раньше не пробовал PIVOT, это мой первый раз, поэтому приветствую всех.

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

pivot не может вернуть то, что вы просили, но вы можете использовать другой подход:

--test dataset
declare @test as table
( txtSchoolID bigint,
  txtSubjectArchivedName varchar(10),
  intSubjectID int,
  intGradeID int,
  intGradeTransposeValue int)
insert into @test 
Values 
(95406288448,'History',7,634,2),
(95406288448,'History',7,635,2),
(95406288448,'History',7,636,2),
(95406288448,'History',7,637,2),
(95406288448,'History',7,638,2),
(95406288448,'History',7,639,2),
(95406288448,'History',7,640,2),
(95406288448,'History',7,641,2),
(95406288448,'History',7,642,2),
(95406288448,'History',7,643,2)

--conditional aggregation
select intSubjectID, 
       txtSchoolID, 
       count(case when intGradeID = 636 then 1 end) AS Effort,
       count(case when intGradeID = 637 then 1 end) AS Focus, 
       count(case when intGradeID = 638 then 1 end) AS Participation, 
       count(case when intGradeID = 639 then 1 end) AS Groupwork, 
       count(case when intGradeID = 640 then 1 end) AS Rigour,
       count(case when intGradeID = 641 then 1 end) AS Curiosity,
       count(case when intGradeID = 642 then 1 end) AS Initiative,
       count(case when intGradeID = 643 then 1 end) AS SelfOrganisation, 
       count(case when intGradeID = 644 then 1 end)  as Perserverance 
from @test
group by intSubjectID, txtSchoolID

тест здесь

0 голосов
/ 09 октября 2018

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

Возможно, ваш запросочень близко к вашему идеальному результату: try:

SELECT        intSubjectID, txtSchoolID, [636] AS Effort, [637] AS Focus, [638] AS Participation, [639] AS Groupwork, [640] AS Rigour, [641] AS Curiosity, [642] AS Initiative,
                    [643] AS SelfOrganisation, [644] as Perserverance               
    FROM         (SELECT txtSchoolID, intReportTypeID FROM VwReportsManagementAcademicReports) p  --just these two
    PIVOT
    (MAX        (intGradeTransposeValue)
    FOR intGradeID IN ([636], [637], [638], [639], [640], [641], [642], [643], [644] )
    ) AS pvt
    WHERE        (intReportCycleID = 142) AND (intReportProgress = 1)
0 голосов
/ 09 октября 2018

В соответствии с комментарием выше - решение было:

попробуйте разделить внутренний выбор вниз только до тех столбцов, которые будут использоваться в сводной таблице и ожидаются в выходных данных.intSubjectID, txtSchoolID, intGradeTransposeValue и intGradeID.все остальные столбцы будут выступать в качестве столбца группировки в выходных данных и могут вызывать этот тип несгруппированных выходных данных.

...