将具有相同 ID 的行拆分为列
Split rows with same ID into columns
我有一个 table 看起来像这样:
ID Name
1 John
1 Maria
1 Sam
2 Lisa
2 Martin
我想要这样的输出:
ID NAME1 NAME2 NAME3
1 John Maria Sam
2 Lisa Martin NULL
我不想使用 pivot
函数,因为它不会给我这个结果(尝试这个时)。
ID
只会生成具有相同 id
nr 的 3 行,因此只有 3 个名称列。
完成此查询的 SP:
INSERT INTO [Database].[dbo].[TEST]
(
[ID],
[Contact1],
[Contact2],
[Contact3]
)
;WITH CTE
AS
(
SELECT
ID,
NAMN,
ROW_NUMBER() OVER(PARTITION BY P_ID ORDER BY NAMN) AS RowNum
FROM tabl1
WHERE VISA_EJ = 0
)
SELECT
[ID],
[1] AS [Contact1],
[2] AS [Contact2],
[3] AS [Contact3]
FROM CTE
PIVOT(MAX(NAMN) for RowNum in ([1],[2],[3])) AS [Contacts]
仍然出现分号错误。
这个现在有效:
WITH ot AS (
SELECT ID, Name,
ROW_NUMBER() OVER (Partition BY ID ORDER BY Name) n
FROM tbl )
SELECT a.id id, a.Name name1,b.Name name2, c.Name name3
FROM ot a
LEFT JOIN ot b ON b.id=a.id AND b.n=2
LEFT JOIN ot c ON c.id=b.id AND c.n=3
WHERE a.n=1
ORDER BY id
看这里:http://sqlfiddle.com/#!6/2f850/1
这将仅在列 name2 和 name3 存在时显示它们。
您可以结合使用 window 函数和旋转:
;with cte as(select id,
name,
row_number() over(partition by id order by name) as rn
from table_name)
select id,
[1] as name1,
[2] as name2,
[3] as name3
from cte
pivot(max(name) for rn in([1],[2],[3]))p
或者你可以对子查询做同样的事情:
select id,
[1] as name1,
[2] as name2,
[3] as name3
from (select id,
name,
row_number() over(partition by id order by name) as rn
from table_name) cte
pivot(max(name) for rn in([1],[2],[3]))p
编辑:
;WITH CTE
AS
(
SELECT
ID,
NAMN,
ROW_NUMBER() OVER(PARTITION BY P_ID ORDER BY NAMN) AS RowNum
FROM tabl1
WHERE VISA_EJ = 0
)
INSERT INTO [Database].[dbo].[TEST]
(
[ID],
[Contact1],
[Contact2],
[Contact3]
)
SELECT
[ID],
[1] AS [Contact1],
[2] AS [Contact2],
[3] AS [Contact3]
FROM CTE
PIVOT(MAX(NAMN) for RowNum in ([1],[2],[3])) AS [Contacts]
我有一个 table 看起来像这样:
ID Name
1 John
1 Maria
1 Sam
2 Lisa
2 Martin
我想要这样的输出:
ID NAME1 NAME2 NAME3
1 John Maria Sam
2 Lisa Martin NULL
我不想使用 pivot
函数,因为它不会给我这个结果(尝试这个时)。
ID
只会生成具有相同 id
nr 的 3 行,因此只有 3 个名称列。
完成此查询的 SP:
INSERT INTO [Database].[dbo].[TEST]
(
[ID],
[Contact1],
[Contact2],
[Contact3]
)
;WITH CTE
AS
(
SELECT
ID,
NAMN,
ROW_NUMBER() OVER(PARTITION BY P_ID ORDER BY NAMN) AS RowNum
FROM tabl1
WHERE VISA_EJ = 0
)
SELECT
[ID],
[1] AS [Contact1],
[2] AS [Contact2],
[3] AS [Contact3]
FROM CTE
PIVOT(MAX(NAMN) for RowNum in ([1],[2],[3])) AS [Contacts]
仍然出现分号错误。
这个现在有效:
WITH ot AS (
SELECT ID, Name,
ROW_NUMBER() OVER (Partition BY ID ORDER BY Name) n
FROM tbl )
SELECT a.id id, a.Name name1,b.Name name2, c.Name name3
FROM ot a
LEFT JOIN ot b ON b.id=a.id AND b.n=2
LEFT JOIN ot c ON c.id=b.id AND c.n=3
WHERE a.n=1
ORDER BY id
看这里:http://sqlfiddle.com/#!6/2f850/1
这将仅在列 name2 和 name3 存在时显示它们。
您可以结合使用 window 函数和旋转:
;with cte as(select id,
name,
row_number() over(partition by id order by name) as rn
from table_name)
select id,
[1] as name1,
[2] as name2,
[3] as name3
from cte
pivot(max(name) for rn in([1],[2],[3]))p
或者你可以对子查询做同样的事情:
select id,
[1] as name1,
[2] as name2,
[3] as name3
from (select id,
name,
row_number() over(partition by id order by name) as rn
from table_name) cte
pivot(max(name) for rn in([1],[2],[3]))p
编辑:
;WITH CTE
AS
(
SELECT
ID,
NAMN,
ROW_NUMBER() OVER(PARTITION BY P_ID ORDER BY NAMN) AS RowNum
FROM tabl1
WHERE VISA_EJ = 0
)
INSERT INTO [Database].[dbo].[TEST]
(
[ID],
[Contact1],
[Contact2],
[Contact3]
)
SELECT
[ID],
[1] AS [Contact1],
[2] AS [Contact2],
[3] AS [Contact3]
FROM CTE
PIVOT(MAX(NAMN) for RowNum in ([1],[2],[3])) AS [Contacts]