选择列值作为列名称

时间:2013-03-28 00:22:41

标签: sql-server-2005 pivot union

我有下表:tb_answers

表结构如下

ID | QUESTIONID | SURVEYID | LEAGUEID | MEMBERID | ANSWER | DATEADDED | DIVISIONID

示例数据

302347 | 2336 | 172 | 146 | 68 | 467 Vallie Lane | 2012-05-21 16:36:22.433 | 0
302350 | 2340 | 172 | 146 | 68 | 591             | 2012-05-21 16:36:22.483 591

我需要提供以下数据。

DYNNAMIC LIST OF QUESTION#QUESTIONID# | MEMBERID | DIVISION
DYNNAMIC LIST OF VALUES OF QUESTION#QUESTIONID#|#MEMBERID#|DIVISION

所以我可以按QUESTION#QUESTIONID#

的值排序

这可能吗?我不熟悉枢轴和联合,所以任何帮助都表示赞赏。

1 个答案:

答案 0 :(得分:1)

这是官方MS的例子:

SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, 
[0], [1], [2], [3], [4]
FROM
(SELECT DaysToManufacture, StandardCost 
    FROM Production.Product) AS SourceTable
PIVOT
(
AVG(StandardCost)
FOR DaysToManufacture IN ([0], [1], [2], [3], [4])
) AS PivotTable;

这是数据的一个支点:

USE AdventureWorks2008R2 ;
GO
SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost 
FROM Production.Product
GROUP BY DaysToManufacture;

产生这个

DaysToManufacture          AverageCost    
0                          5.0885    
1                          223.88    
2                          359.1082    
4                          949.4105

正如您所看到的,他们明确指定了透视列 - 它不是数据驱动的。为了完全数据驱动的东西,你基本上必须做两次传递,第一次将列名称生成为字符串模板。第二遍执行生成的SQL。

DECLARE @dyncols AS VARCHAR(MAX) = (SELECT 
  STUFF((SELECT DISTINCT ',' + QUOTENAME(CONVERT(VARCHAR(50), YOURPIVOTCOL)) 
  FROM YOURTABLE FOR XML PATH(''), TYPE).VALUE('.', 'VARCHAR(MAX)'),1,1,''))