我一直在创建一个将字符串转换为表格的轴,幸运的是它确实如此。但它只包含一行(表中的第一条记录)。
以下是代码:
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
答案 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
查询的输出。