2015-09-18 103 views
1

我一直在创建一个将字符串转换为表格的支点,幸运的是它。但它只包含一行(表中的第一条记录)。PIVOT只返回一行

下面的代码:

SELECT 
    COL1,COL2,COL3.... etc. 
FROM 
(
    SELECT 
     LEFT(CA.val,CHARINDEX('=',CA.val)-1) ColumnName, 
     SUBSTRING(CA.val,CHARINDEX('=',CA.val)+1,100) Value 
    FROM (MYTABLE) 
    CROSS APPLY (MYFUNCTION)(MYTABLECOLUMNNAME,'|') CA 
) PD 
PIVOT 
(
    MAX(Value) 
    FOR ColumnName IN (COL1,COL2,COL3.... etc.) 
) AS PT 

的输出只有SELECT声明(没有将它放到PIVOT):

ColumnName Value 
------------------------ 
Name  Value1 
Age   Value2 
Name  DiffValue 
Age   DiffValue2 

输出表的PIVOT

Name AGE 
Value1 Value2 

所以基本上数据透视表只打印冷杉t记录并绕过另一行。是否因为它具有相同的列名?

我所要的输出是这样的:

Name  AGE 
------------------------ 
Value1  Value2 
DiffValue DiffValue2 

回答

1

我不是很熟悉的PIVOT语法,但这里是使用条件聚集转动你的数据的另一种方式:

WITH Tbl(ColumnName, Value) AS(
    SELECT 'Name', 'Value1' UNION ALL 
    SELECT 'Age', 'Value2' UNION ALL 
    SELECT 'Name', 'DiffValue' UNION ALL 
    SELECT 'Age', 'DiffValue2' 
), 
CteRn AS(
    SELECT *, 
     Rn = ROW_NUMBER() OVER(PARTITION BY ColumnName ORDER BY Value) 
    FROM Tbl 
) 
SELECT 
    Name = MAX(CASE WHEN ColumnName = 'Name' THEN Value END), 
    Age = MAX(CASE WHEN ColumnName = 'Age' THEN Value END) 
FROM CteRn 
GROUP BY Rn 

这里的底线是,您需要添加ROW_NUMBER为您的数据添加一个ID,然后在GROUP BY中使用该ID。


这是我在PIVOT尝试:

;WITH Tbl(ColumnName, Value) AS(
    SELECT 'Name', 'Value1' UNION ALL 
    SELECT 'Age', 'Value2' UNION ALL 
    SELECT 'Name', 'DiffValue' UNION ALL 
    SELECT 'Age', 'DiffValue2' 
), 
CteRn AS(
    SELECT *, 
     Rn = ROW_NUMBER() OVER(PARTITION BY ColumnName ORDER BY Value) 
    FROM Tbl 
) 
SELECT 
    [Name], [Age] 
FROM CteRn r 
PIVOT(
    MAX(Value) 
    FOR ColumnName IN([Name], [Age]) 
)p 

热膨胀系数TBL这里是你的SELECT查询的输出。

+0

所以真的没有办法把在枢轴的所有行,而无需钥匙? ID?或者?这就是我一直在考虑的一些ID,但我认为有没有ID或其他方式的方式。无论如何,谢谢你的答案。 – Kuroi

+0

我相信你需要一个'UNPIVOT'-ed列,在这种情况下'Rn'可以达到你想要的结果。再一次,我对“PIVOT”不是很熟悉。但是在条件聚合的情况下,你肯定需要这个唯一的ID。 –