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