试图找出如何做一个dynamic的数据透视表连接

我还是一个T-SQL的初学者,有一些相对简单的select语句和一些连接。 我想把它放到一个dynamic数据透视表中。 这个声明的目的是要显示非营利性服务及其结果,新旧结果是相同数据的不同词语的组合。

SELECT Service.Name, OutcomeIndicator."Desc" AS OutcomeDesc, NewOutcomeIndicator.Description As NewOutcomeDesc FROM service FULL OUTER JOIN OutcomeIndicator ON ServiceOutcomeIndicator.OutcomeIndicatorID=OutcomeIndicator.OutcomeIndicatorID FULL OUTER JOIN NewOutcomeIndicator ON NewOutcomeIndicatorMapping.NewOutcomeIndicatorID=NewOutcomeIndicator.NewOutcomeIndicatorID 

但是,当我运行这个语句时,显然会返回每一行,包括ServiceName的多个值,因为每个服务都可以有多个结果/新对象配对。

 +-------------+----------------+------------------+ | ServiceName | OutcomeDesc1 | NewOutcomeDesc1 | +-------------+----------------+------------------+ | Service34 | OutcomeDesc14 | NewOutcomeDesc14 | | Service34 | OutcomeDesc12 | NewOutcomeDesc12 | | Service35 | OutcomeDesc4 | NewOutcomeDesc4 | | Service44 | OutcomeDesc80 | NewOutcomeDesc80 | | Service44 | OutcomeDesc99 | NewOutcomeDesc99 | | Service51 | OutcomeDesc50 | NewOutcomeDesc50 | 

出于报告目的,因为这是复制到Excel中,我想要更多的东西是这样的:

 +--------------+-----------------+-------------------+-----------------+-------------------+--------------+---------------------+ | ServiceName | OutcomeDesc1 | NewOutcomeDesc1 | OutcomeDesc2 | NewOutcomeDesc2 | OutcomeDesc3 | NewOutcomeDesc3 | +--------------+-----------------+-------------------+-----------------+-------------------+--------------+---------------------+ | Service34 | OutcomeDesc14 | NewOutcomeDesc14 | OutcomeDesc12 | NewOutcomeDesc12 | | | | Service35 | OutcomeDesc4 | NewOutcomeDesc4 | | | | | | Service44 | OutcomeDesc80 | NewOutcomeDesc80 | OutcomeDesc99 | NewOutcomeDesc99 | | | | Service51 | OutcomeDesc50 | NewOutcomeDesc50 | | | | | +--------------+-----------------+-------------------+-----------------+-------------------+--------------+---------------------+ 

任何想法如何可以更改我的SQL语句来做到这一点? 我可以静态定义列的数量,因为我知道每个服务的结果不会超过3个。

我知道如何在sql中做一个静态数据透视表,但是因为有数百个服务和结果,所以我无法定义统计分配每个Service值到一个列的逻辑。 dynamic的数据透视表有点难以理解,但我还没有find一个教程来做这个,同时还包括一个join语句。

任何帮助赞赏。

你不需要dynamic的pivot,实际上你甚至不需要使用真正的pivot命令,你可以很容易地用CASE和GROUP BY来模拟

在检索结果之后,使用ROW_NUMBER()函数为每行分配数字1-3,最后使用该RNselect进入哪个列的内容。

这是一个片段,在第一个CTE中添加真实的代码。

 WITH CTE_Source AS ( --Your query goes here ) , CTE_RN AS ( SELECT * , ROW_NUMBER() OVER (PARTITION BY ServiceName ORDER BY OutcomeDesc) RN FROM CTE_Source ) SELECT ServiceName , MAX(CASE WHEN RN = 1 THEN OutcomeDesc END) AS OutcomeDesc1 , MAX(CASE WHEN RN = 1 THEN NewOutcomeDesc END) AS NewOutcomeDesc1 , MAX(CASE WHEN RN = 2 THEN OutcomeDesc END) AS OutcomeDesc2 , MAX(CASE WHEN RN = 2 THEN NewOutcomeDesc END) AS NewOutcomeDesc2 , MAX(CASE WHEN RN = 3 THEN OutcomeDesc END) AS OutcomeDesc3 , MAX(CASE WHEN RN = 3 THEN NewOutcomeDesc END) AS NewOutcomeDesc3 FROM CTE_RN GROUP BY ServiceName 

使用您的数据作为SourceTable的DEMO