我有以下数据:
ID Data
1 tera
1 add
1 alkd
2 adf
2 add
3 wer
4 minus
4 add
4 ten
我正在尝试使用数据透视表将行推入1行,每个ID包含多个列。 如下:
ID Custom1 Custom2 Custom3 Custom4..........
1 tera add alkd
2 adf add
3 wer
4 minus add ten
到目前为止,我有以下查询:
INSERT INTO @SpeciInfo
(ID, [Custom1], [Custom2], [Custom3], [Custom4], [Custom5],[Custom6],[Custom7],[Custom8],[Custom9],[Custom10],[Custom11],[Custom12],[Custom13],[Custom14],[Custom15],[Custom16])
SELECT
ID,
[Custom1],
[Custom2],
[Custom3],
[Custom4],
[Custom5],
[Custom6],
[Custom7],
[Custom8],
[Custom9],
[Custom10],
[Custom11],
[Custom12],
[Custom13],
[Custom14],
[Custom15],
[Custom16]
FROM SpeciInfo) p
PIVOT
(
(
[Custom1],
[Custom2],
[Custom3],
[Custom4],
[Custom5],
[Custom6],
[Custom7],
[Custom8],
[Custom9],
[Custom10],
[Custom11],
[Custom12],
[Custom13],
[Custom14],
[Custom15],
[Custom16]
)
) AS pvt
ORDER BY ID;
我需要16个字段,但我不完全确定我在From子句中做了什么,或者我是否正确地这样做了?
由于
答案 0 :(得分:2)
如果您要寻找的是动态构建列,那么通常称为动态交叉表,如果不采用动态SQL(构建查询字符串),则不能在T-SQL中完成,这是不推荐的。相反,您应该在中间层或报告应用程序中构建该查询。
如果您只是想要一个静态解决方案,那么在SQL Server 2005或更高版本中,使用PIVOT查找所需内容的替代方法可能类似:
With NumberedItems As
(
Select Id, Data
, Row_Number() Over( Partition By Id Order By Data ) As ColNum
From SpeciInfo
)
Select Id
, Min( Case When Num = 1 Then Data End ) As Custom1
, Min( Case When Num = 2 Then Data End ) As Custom2
, Min( Case When Num = 3 Then Data End ) As Custom3
, Min( Case When Num = 4 Then Data End ) As Custom4
...
From NumberedItems
Group By Id
原始数据中的一个严重问题是没有序列指示符,因此系统无法知道给定ID的哪个项应出现在Custom1列中而不是Custom2列。在上面的查询中,我按名称任意排序。