PIVOT只返回一行

时间:2015-09-18 06:42:11

标签: sql-server pivot-table

我一直在创建一个将字符串转换为表格的轴,幸运的是它确实如此。但它只包含一行(表中的第一条记录)。

以下是代码:

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 

因此,数据透视表基本上只打印第一条记录并绕过另一条记录。是因为它具有相同的列名吗?

我希望输出如下:

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

1 个答案:

答案 0 :(得分: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

cte TBL此处是SELECT查询的输出。