2017-07-30 26 views
0

我仍然是一个初学者与T-SQL有什么是一个相对简单的选择语句与几个联接。我试图把它放到一个动态数据透视表中。本声明的目的在于展示非营利性服务及其结果,新旧结果仅仅是同一数据的不同词汇。试图找出如何做一个动态的数据透视表与连接

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 

然而,当我运行这个说法,它显然返回的每一行,包括对服务名称的多个值,因为每个服务可以有多种结果/ NewOutcome配对。

+-------------+----------------+------------------+ 
| 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中创建一个静态数据透视表,但由于有数百个服务和结果,我无法定义统计分配每个服务值到列的逻辑。动态数据透视表对我而言也有点难以理解,但我还没有找到一个能够做到这一点的教程,同时还包括了一个联合声明。

任何帮助表示赞赏。

+0

,因为你知道的列数事先不需要动态支点。当您根据表中的值创建列时,将使用动态数据透视表。 –

回答

1

你不需要为这个充满活力的支点,其实你甚至不需要使用真正的转动命令时,你可以轻松地与CASE和GROUP BY模拟

检索结果显示,你在那里后,只要使用ROW_NUMBER()函数为每行分配数字1-3,最后使用该RN选择进入哪个列的内容。

这是一段代码,在第一个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 

DEMO using your data as SourceTable