仅转置 SQL 服务器中的几列
Transposing only few columns in SQL Server
我的 table 中有 4 列,例如:
key cusi isi name
1 46644UAQ1 US46642EAV83 A
1 46644UAR9 XS0062104145 A
1 254206AC9 A
2 05617YAJ8 US86359AXP38 B
2 885220BP7 B
2 null B
3 885220BP5 885220BP7345 c
由于 cusi 和 isi 列,键和名称列内容重复。在这种情况下,我只想转置 cusi 和 isi 列中的几列,以便我得到 id =1 的 1 条记录和另一条记录对于 id=2 。在我的用例中,最多可以有 3 个 ditinct cusi 或 3 个 isi 列。
转置 table 应该
key name cusi1 cusi2 cusi3 isi1 isi2 isi3
1 A 46644UAQ1 46644UAR9 254206AC9 US46642EAV83 XS0062104145 NULL
2 A 46644UAR9 05617YAJ8 885220BP7 US86359AXP38 NULL NULL
3 c 885220BP5 null null 885220BP7345 NULL NULL
在某些情况下,可能只有 1 行,如上面的示例,它用于 key= 3
我知道 sql 有 PIVOT 和 UNPIVOT 查询,但我不确定如何使用它来转置 table 的选择列
任何帮助都会有很大帮助。
谢谢
如果您知道每个 key
-name
组都有固定数量的记录(三个,根据您给我们的示例数据),那么普通的非主元应该可以工作。在下面的查询中,我使用行号来区分结果集中 cusi
和 isi
所需的三列中的每一列。
SELECT t.key,
t.name,
MAX(CASE WHEN t.rn = 1 THEN cusi END) AS cusi1,
MAX(CASE WHEN t.rn = 2 THEN cusi END) AS cusi2,
MAX(CASE WHEN t.rn = 3 THEN cusi END) AS cusi3,
MAX(CASE WHEN t.rn = 1 THEN isi END) AS isi1,
MAX(CASE WHEN t.rn = 2 THEN isi END) AS isi2,
MAX(CASE WHEN t.rn = 3 THEN isi END) AS isi3
FROM
(
SELECT key,
cusi,
isi,
name,
ROW_NUMBER() OVER(PARTITION BY key ORDER BY cusi) AS rn
FROM yourTable
) t
GROUP BY t.key,
t.name
注意SQL服务器还有一个PIVOT
功能,可以替代我给的
我的 table 中有 4 列,例如:
key cusi isi name
1 46644UAQ1 US46642EAV83 A
1 46644UAR9 XS0062104145 A
1 254206AC9 A
2 05617YAJ8 US86359AXP38 B
2 885220BP7 B
2 null B
3 885220BP5 885220BP7345 c
由于 cusi 和 isi 列,键和名称列内容重复。在这种情况下,我只想转置 cusi 和 isi 列中的几列,以便我得到 id =1 的 1 条记录和另一条记录对于 id=2 。在我的用例中,最多可以有 3 个 ditinct cusi 或 3 个 isi 列。
转置 table 应该
key name cusi1 cusi2 cusi3 isi1 isi2 isi3
1 A 46644UAQ1 46644UAR9 254206AC9 US46642EAV83 XS0062104145 NULL
2 A 46644UAR9 05617YAJ8 885220BP7 US86359AXP38 NULL NULL
3 c 885220BP5 null null 885220BP7345 NULL NULL
在某些情况下,可能只有 1 行,如上面的示例,它用于 key= 3
我知道 sql 有 PIVOT 和 UNPIVOT 查询,但我不确定如何使用它来转置 table 的选择列 任何帮助都会有很大帮助。 谢谢
如果您知道每个 key
-name
组都有固定数量的记录(三个,根据您给我们的示例数据),那么普通的非主元应该可以工作。在下面的查询中,我使用行号来区分结果集中 cusi
和 isi
所需的三列中的每一列。
SELECT t.key,
t.name,
MAX(CASE WHEN t.rn = 1 THEN cusi END) AS cusi1,
MAX(CASE WHEN t.rn = 2 THEN cusi END) AS cusi2,
MAX(CASE WHEN t.rn = 3 THEN cusi END) AS cusi3,
MAX(CASE WHEN t.rn = 1 THEN isi END) AS isi1,
MAX(CASE WHEN t.rn = 2 THEN isi END) AS isi2,
MAX(CASE WHEN t.rn = 3 THEN isi END) AS isi3
FROM
(
SELECT key,
cusi,
isi,
name,
ROW_NUMBER() OVER(PARTITION BY key ORDER BY cusi) AS rn
FROM yourTable
) t
GROUP BY t.key,
t.name
注意SQL服务器还有一个PIVOT
功能,可以替代我给的