Преобразование сводной таблицы в MS Access в сводную таблицу в SQL Server - PullRequest
2 голосов
/ 04 апреля 2019

Мне нужно преобразовать некоторые операторы SQL из MS Access в SQL Server, используя сводную таблицу. У меня есть представление [UETTDRSB39A Criteria] и таблица [RPLEvidence options].

Я никогда не пытался использовать сводные таблицы в SQL Server.

Код MS Access:

TRANSFORM First([UETTDRSB39A Criteria].[RPL Link]) AS [FirstOfRPL Link]
SELECT [UETTDRSB39A Criteria].[RPL Link], [UETTDRSB39A Criteria].[RPLEvidence options].Detail
FROM [UETTDRSB39A Criteria], [2_Candidate Evidence records]
WHERE ((([UETTDRSB39A Criteria].Pathway) In ('Common','Electrical')))
GROUP BY [UETTDRSB39A Criteria].[RPL Link], [UETTDRSB39A Criteria].[RPLEvidence options].Detail
PIVOT [UETTDRSB39A Criteria].Prerequisite;

Требуемый (Доступ) выход: Access Output Screenshot : Desired Output

Неверный запрос к SQL Server:

use LinesmanRPL
SELECT * from
(
Select distinct [RPL Link] as expr1, [RPL Link], [RPLEvidenceOptionsDetail], [Prerequisite] 
from [UETTDRSB39A Criteria], [2_Candidate Evidence records] 
where [UETTDRSB39A Criteria].Pathway = 'Common' or [UETTDRSB39A Criteria].Pathway = 'Electrical'
)temp
PIVOT  
(  
min(temp.expr1)  
FOR temp.[Prerequisite]
IN (Prereq1, Prereq2, Prereq3)  
) AS p
order by [RPL Link]

Фактический (SQL) вывод: SQL Output Screenshot : Actual Output

Пример данных для UETTDRSB39A Критерии

Пример данных для 2_Кандидатных доказательств

Я также попробовал другой код SQL:

use LinesmanRPL
DECLARE @PivotColumnHeaders VARCHAR(max);
SELECT distinct @PivotColumnHeaders = COALESCE(@PivotColumnHeaders + ',['+ CAST(Prerequisite as varchar) + ']','['+ CAST(Prerequisite as varchar) + ']','['+ CAST(Prerequisite as varchar) + ']')
FROM [UETTDRSB39A Criteria]
where [UETTDRSB39A Criteria].Pathway='Common' or [UETTDRSB39A Criteria].Pathway='Electrical';
DECLARE @PivotTableSQL NVARCHAR(max);
SET @PivotTableSQL = N'
SELECT distinct *
FROM (
SELECT DISTINCT
    U.[RPL Link],
    U.Prerequisite,
    U.[RPLEvidenceOptionsDetail]
FROM [UETTDRSB39A Criteria] as U, [2_Candidate Evidence records] as C
    ) as pivotData
    pivot(
        min([RPL Link])
        for Prerequisite in (' + @PivotColumnHeaders +')
    ) as pivotTable    
'
;
execute(@PivotTableSQL);

Вывод этого кода: SQL Output Screenshot : Actual Output 2

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Посмотрев на решение, предоставленное @Jonathan Willcock, я смог найти решение для вашей проблемы. Посмотрите на это, и, возможно, вам, возможно, придется уточнить это.

USE LinesmanRPL
DECLARE @PrerequisiteColumn AS NVARCHAR(MAX),
        @SQLforPivotTable  AS NVARCHAR(MAX);
SET @PrerequisiteColumn = STUFF((SELECT distinct ',' + QUOTENAME(Prerequisite) 
        FROM [UETTDRSB39A Criteria]
        WHERE [UETTDRSB39A Criteria].Pathway = 'Common' OR [UETTDRSB39A Criteria].Pathway = 'Electrical'
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'')
SET @SQLforPivotTable = 'SELECT RPLEvidenceOptionsDetail, ' + @PrerequisiteColumn + ' FROM 
        (
          SELECT [RPL Link], RPLEvidenceOptionsDetail, Prerequisite 
          FROM [UETTDRSB39A Criteria]
        ) Temp
        PIVOT 
        (
          MIN([RPL Link]) FOR Prerequisite IN (' + @PrerequisiteColumn + ')
        ) PivotTable '
EXECUTE(@SQLforPivotTable)
1 голос
/ 04 апреля 2019

Я думаю, вы сделали это излишне сложным.Я почти уверен, что вам нужно только следующее:

SELECT * from
(
Select distinct RPL_Link as expr1, RPL_Link, RPLEvidence_Options_Detail, Prerequisite 
from UETTDRSB39A_Criteria
where UETTDRSB39A_Criteria.Pathway = 'Common' or UETTDRSB39A_Criteria.Pathway = 'Electrical'
)temp
PIVOT  
(  
min(temp.expr1)  
FOR temp.[Prerequisite]
IN ([UETTDREL16A], [UETTDRIS67A], [UETTDRSB39A])  
) AS p
ORDER BY RPL_LINK

Обратите внимание, что при импорте ваших тестовых данных я использовал подчеркивания вместо пробелов, но я думаю, что должно быть понятно, что вам нужно делать,

HTH

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