将行转换为列显示百分比总计

时间:2015-02-13 18:24:23

标签: sql-server-2008

我几乎知道怎么做一个支点,但我遇到了一个我无法弄清楚的问题。我有这个包含" Site"的数据集。作为文本(行垂直),Q1,Q2,Q3,Q4,Q5,Q6,Q7为百分比(%)总计(列水平),我的问题是我想将网站显示为列,Q1为Q7作为一行,我只是无法弄清楚如何做到这一点。有人可以帮助我吗?

感谢。

1 个答案:

答案 0 :(得分:1)

你的问题的预期输出并不是很清楚。但既然你问过

  

我希望将网站显示为一列,将Q1至Q7显示为一行

您需要将列作为行并将行转换为列。为此,您需要先unpivot然后再转动。

注意:表的列名和示例表可能不同。但请遵循我使用过的方法。

样本表

CREATE TABLE #TEMP([SITE] VARCHAR(10),Q1 INT,Q2 INT,Q3 INT,Q4 INT,Q5 INT,Q6 INT,Q7 INT)

 INSERT INTO #TEMP
 SELECT 'A',1,3 ,4,2,7,8,9
 UNION ALL
 SELECT 'B',2,6 ,9,4,8,11,12
 UNION ALL
 SELECT 'C',10,3 ,2,5,6,4,9

<强> QUERY

您可以使用CROSS APPLY unpivot列到行。

(a)当事先知道行中的值时,您可以使用静态数据透视。

SELECT * FROM 
 (
     SELECT [SITE],VAL,COLNAME
     FROM #TEMP
     CROSS APPLY(VALUES (Q1,'Q1'),(Q2,'Q2'),(Q3,'Q3'),(Q4,'Q4'),(Q5,'Q5'),(Q6,'Q6'),(Q7,'Q7'))
     COLUMNNAMES(VAL,COLNAME)
 )R
 PIVOT 
 ( 
     MIN(VAL)
     for [SITE] in ([A],[B],[C])
 )AS P

- Click here查看结果

(b)当行中的值提前未知时,您可以使用动态数据透视。

-- Get the values in the row and store in a variable
DECLARE @cols NVARCHAR (MAX)

SELECT @cols = COALESCE (@cols + ',[' + [SITE] + ']', '[' + [SITE] + ']')
               FROM    (SELECT DISTINCT [SITE] FROM #TEMP) PV 
               ORDER BY [SITE]

-- Convert the values to dynamic number of columns       
DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT * FROM 
             (
                 SELECT [SITE],VAL,COLNAME
                 FROM #TEMP
                 CROSS APPLY(VALUES (Q1,''Q1''),(Q2,''Q2''),(Q3,''Q3''),
                                    (Q4,''Q4''),(Q5,''Q5''),(Q6,''Q6''),(Q7,''Q7''))
                 COLUMNNAMES(VAL,COLNAME)
             ) x
             PIVOT 
             (
                 MIN(VAL)
                 FOR [SITE] in  (' + @cols + ')
            ) p
            ORDER BY COLNAME;' 

EXEC SP_EXECUTESQL @query