Sql server 将MS Access中的透视表转换为SQL Server中的透视表
我需要使用透视表将一些SQL语句从MS Access转换为SQL Server。我有一个视图Sql server 将MS Access中的透视表转换为SQL Server中的透视表,sql-server,ms-access,pivot,pivot-table,where-clause,Sql Server,Ms Access,Pivot,Pivot Table,Where Clause,我需要使用透视表将一些SQL语句从MS Access转换为SQL Server。我有一个视图[UETTDRSB39A标准]和一个表[rplevince options] 我从未尝试过在SQL Server中使用pivot表 MS访问代码为: TRANSFORM First([UETTDRSB39A Criteria].[RPL Link]) AS [FirstOfRPL Link] SELECT [UETTDRSB39A Criteria].[RPL Link], [UETTDRSB39A Cr
[UETTDRSB39A标准]
和一个表[rplevince options]
我从未尝试过在SQL Server中使用pivot表
MS访问代码为:
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;
所需(访问)输出为:
错误的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代码:
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);
这段代码的输出是:我认为您使它变得不必要的复杂。我非常确定,您所需要的只是以下内容:
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在查看了@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)
非常接近,第一个示例失败,因为查询中不存在透视列名。第二个示例不起作用,因为它只拾取第一个动态列。下面是一个如何动态构建列列表的示例:谢谢@Tejas,它成功了!您认为我是否可以隐藏所有三列中都为null的行?谢谢您的解决方案。然而,另一个解决方案更灵活,因为它创建动态表。