在 SQL 服务器中将行转置为列,我尝试使用数据透视表,但未达到预期结果
Transpose rows into columns in SQL Server, I try it using pivot but, expected result is not reached
在 SQL 服务器中将行转换为列,我尝试使用 pivot 但是没有达到预期结果,使用 pivot 仅获取最大值
CREATE TABLE [dbo].[test]
(
[patientid] [int] NULL,
[sourcename] [varchar](200) NULL,
[identifier] [varchar](100) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[test] ([patientid], [sourcename], [identifier])
VALUES (100, N'SIN', N'2663563')
INSERT [dbo].[test] ([patientid], [sourcename], [identifier])
VALUES (100, N'SIN', N'2453433')
INSERT [dbo].[test] ([patientid], [sourcename], [identifier])
VALUES (100, N'MED', N'534545')
INSERT [dbo].[test] ([patientid], [sourcename], [identifier])
VALUES (100, N'MED', N'212334')
INSERT [dbo].[test] ([patientid], [sourcename], [identifier])
VALUES (100, N'NXG', N'8678')
INSERT [dbo].[test] ([patientid], [sourcename], [identifier])
VALUES (100, N'NXG', N'2131232334')
预期输出:
使用row_number()
和条件聚合:
select patientid,
max(case when sourcename = 'SIN' then identifier end) as sin,
max(case when sourcename = 'MED' then identifier end) as med,
max(case when sourcename = 'NXG' then identifier end) as nxg
from (
select t.*, row_number() over(partition by sourcename, sourcename order by identifier) rn
from test t
) t
group by patientid, rn
您可以将条件聚合与 row_number()
一起使用:
select partitionid,
max(case when sourcename = 'SIN' then identifier end) as sin,
max(case when sourcename = 'MED' then identifier end) as med,
max(case when sourcename = 'NXG' then identifier end) as nxg
from (select t.*,
row_number() over (partition by partitionid, sourcename order by identifier) as seqnum
from t
) t
group by partitionid, seqnum
在 SQL 服务器中将行转换为列,我尝试使用 pivot 但是没有达到预期结果,使用 pivot 仅获取最大值
CREATE TABLE [dbo].[test]
(
[patientid] [int] NULL,
[sourcename] [varchar](200) NULL,
[identifier] [varchar](100) NULL
) ON [PRIMARY]
GO
INSERT [dbo].[test] ([patientid], [sourcename], [identifier])
VALUES (100, N'SIN', N'2663563')
INSERT [dbo].[test] ([patientid], [sourcename], [identifier])
VALUES (100, N'SIN', N'2453433')
INSERT [dbo].[test] ([patientid], [sourcename], [identifier])
VALUES (100, N'MED', N'534545')
INSERT [dbo].[test] ([patientid], [sourcename], [identifier])
VALUES (100, N'MED', N'212334')
INSERT [dbo].[test] ([patientid], [sourcename], [identifier])
VALUES (100, N'NXG', N'8678')
INSERT [dbo].[test] ([patientid], [sourcename], [identifier])
VALUES (100, N'NXG', N'2131232334')
预期输出:
使用row_number()
和条件聚合:
select patientid,
max(case when sourcename = 'SIN' then identifier end) as sin,
max(case when sourcename = 'MED' then identifier end) as med,
max(case when sourcename = 'NXG' then identifier end) as nxg
from (
select t.*, row_number() over(partition by sourcename, sourcename order by identifier) rn
from test t
) t
group by patientid, rn
您可以将条件聚合与 row_number()
一起使用:
select partitionid,
max(case when sourcename = 'SIN' then identifier end) as sin,
max(case when sourcename = 'MED' then identifier end) as med,
max(case when sourcename = 'NXG' then identifier end) as nxg
from (select t.*,
row_number() over (partition by partitionid, sourcename order by identifier) as seqnum
from t
) t
group by partitionid, seqnum