TSql透视或行到列
我已经看过很多关于Pivot或将行转换为列的文章,但我仍然不太走运,所以我决定发布这个问题 我的桌子是空的TSql透视或行到列,sql,sql-server,tsql,pivot,unpivot,Sql,Sql Server,Tsql,Pivot,Unpivot,我已经看过很多关于Pivot或将行转换为列的文章,但我仍然不太走运,所以我决定发布这个问题 我的桌子是空的 Id列名称 1系列 2数据1 3数据2 我的表行是 Id列的Id值 1 1 1 2 1 2 3 1 3 4 2 25 5 2 26 6 2 27 7 3 28 8 3 29 9 3 30 我希望得到如下结果,我认为使用unpivot或pivot可能有效。结果应该是
Id列名称
1系列
2数据1
3数据2
我的表行是
Id列的Id值
1 1 1
2 1 2
3 1 3
4 2 25
5 2 26
6 2 27
7 3 28
8 3 29
9 3 30
我希望得到如下结果,我认为使用unpivot或pivot可能有效。结果应该是这样的-
串行数据1数据2
1 25 28
2 26 29
3 27 30
任何帮助都会有帮助。我认为
pivot
在这里没有用处。试试这个
WITH cte1
AS (SELECT Row_number()OVER(ORDER BY Id) RN,
value AS Data1
FROM yourtable
WHERE col_id = 1),
cte2
AS (SELECT Row_number()OVER(ORDER BY Id) RN,
value AS Data2
FROM yourtable
WHERE col_id = 2),
cte3
AS (SELECT Row_number()OVER(ORDER BY Id) RN,
value AS Data3
FROM yourtable
WHERE col_id = 3)
SELECT Row_number()OVER(ORDER BY a.rn) AS serial,
Data1,
Data2,
Data3
FROM cte1 A
FULL OUTER JOIN cte2 B
ON a.RN = b.RN
FULL OUTER JOIN cte3 C
ON b.RN = C.RN
我将指出,您的数据模型需要一些改进,因此我的连接串行的方法是临时的,在实际项目中不可信,因为表之间没有逻辑连接。以下是如何透视数据:
;WITH [rows] AS
(
SELECT id, value, col_id
FROM
(values
(1,1,1),(2,1,2),
(3,1,3),(4,2,25),
(5,2,26),(6,2,27),
(7,3,28),(8,3,29),
(9,3,30)) x(Id, col_id, value)
), cols as
(
SELECT cols.id, col_name
FROM
(values
( 2, 'Data1'),( 3, 'Data2'))
cols(Id, col_name)
), result as
(
SELECT row_number() OVER (partition by col_id order by [rows].id) rn, col_name, value
FROM
cols
JOIN
[rows]
ON [rows].col_id = cols.id
WHERE cols.id > 1
)
SELECT rn Serial, Data1, Data2
FROM
result
PIVOT
(min([value])
FOR col_name
in([Data1],[Data2])
)AS p
结果:
Serial Data1 Data2
1 25 28
2 26 29
3 27 30
你能发布你已经尝试过的查询吗?到底是什么链接了这两个表?别忘了接受答案,还有你之前的问题,cols表中的id和rows表中的COLU id(外键)是链接。在这两种情况下,你的完全连接都应该包括CTE1。否则,如果表b没有数据,您将丢失数据。我还将第一次完全连接到左连接Hey fireblade,您的解决方案是正确的,但我认为我需要在列数未知时构建动态sql。