SQL 服务器:如何从 table 创建层级组合
SQL Server: How to create hierarchy combinations from a table
我将层次结构的级别堆叠在一个 table 中,我想创建组合。我尝试使用递归查询,但我无法弄清楚。我相信一定有一种简单的方法可以做到这一点。我有不同级别的不同层次结构,所以我不想为每个级别编写代码,我想要一个处理级别数的查询。如果有任何帮助,我将不胜感激!
下面是创建示例数据的代码:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [tmp].[tblSample](
[hier] [nvarchar](255) NULL,
[lvl] [nvarchar](255) NULL,
[id] [int] NULL
) ON [PRIMARY]
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA00010102', N'3', 3)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA00019999', N'3', 4)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA00020107', N'3', 6)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA00029999', N'3', 7)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA11810001', N'3', 9)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA11812087', N'3', 10)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA11852299', N'3', 12)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA1185', N'2', 12)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA', N'1', 12)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA1181', N'2', 10)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA', N'1', 10)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA1181', N'2', 9)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA', N'1', 9)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA0002', N'2', 7)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA', N'1', 7)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA0002', N'2', 6)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA', N'1', 6)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA0001', N'2', 4)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA', N'1', 4)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA0001', N'2', 3)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA', N'1', 3)
GO
这是我为此特定层次结构生成所需结果的查询:
SELECT t1.hier, t2.hier, t3.hier FROM tblSample t1
INNER JOIN tblSample t2 ON t1.id=t2.id AND t2.lvl=t1.lvl+1
INNER JOIN tblSample t3 ON t1.id=t3.id AND t3.lvl=t1.lvl+2
示例数据:
想要的结果:
这对我来说就像是条件聚合:
select max(case when lvl = 1 then hier end),
max(case when lvl = 2 then hier end),
max(case when lvl = 3 then hier end)
from tblSample
group by id;
或者,您可以将其表述为联接:
select s.hier, s2.hier, s3.hier
from tblSample s join
tblSample s2
on s2.lvl = s.lvl + 1 and
s2.id = s.id join
tblSample s3
on s3.lvl = s2.lvl + 1 and
s3.id = s2.id
where s.lvl = 1;
Here 是一个 db<>fiddle.
我们也可以使用 PIVOT
但同样我们必须在旋转子句中提供某个最大值 level
并使其动态化,您需要考虑将其转换为 Dynamic Sql
(不幸的是我不太熟悉SQL服务器动态SQL)
select id
,[1] as hier1
,[2] as hier2
,[3] as hier3
from
(
select t1.hier,t1.lvl,t1.id
from tblsample t1
) src
pivot
(
max(hier)
for lvl in ([1], [2], [3])
) piv;
我将层次结构的级别堆叠在一个 table 中,我想创建组合。我尝试使用递归查询,但我无法弄清楚。我相信一定有一种简单的方法可以做到这一点。我有不同级别的不同层次结构,所以我不想为每个级别编写代码,我想要一个处理级别数的查询。如果有任何帮助,我将不胜感激!
下面是创建示例数据的代码:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [tmp].[tblSample](
[hier] [nvarchar](255) NULL,
[lvl] [nvarchar](255) NULL,
[id] [int] NULL
) ON [PRIMARY]
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA00010102', N'3', 3)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA00019999', N'3', 4)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA00020107', N'3', 6)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA00029999', N'3', 7)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA11810001', N'3', 9)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA11812087', N'3', 10)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA11852299', N'3', 12)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA1185', N'2', 12)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA', N'1', 12)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA1181', N'2', 10)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA', N'1', 10)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA1181', N'2', 9)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA', N'1', 9)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA0002', N'2', 7)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA', N'1', 7)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA0002', N'2', 6)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA', N'1', 6)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA0001', N'2', 4)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA', N'1', 4)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA0001', N'2', 3)
GO
INSERT [tmp].[tblSample] ([hier], [lvl], [id]) VALUES (N'AA', N'1', 3)
GO
这是我为此特定层次结构生成所需结果的查询:
SELECT t1.hier, t2.hier, t3.hier FROM tblSample t1
INNER JOIN tblSample t2 ON t1.id=t2.id AND t2.lvl=t1.lvl+1
INNER JOIN tblSample t3 ON t1.id=t3.id AND t3.lvl=t1.lvl+2
示例数据:
想要的结果:
这对我来说就像是条件聚合:
select max(case when lvl = 1 then hier end),
max(case when lvl = 2 then hier end),
max(case when lvl = 3 then hier end)
from tblSample
group by id;
或者,您可以将其表述为联接:
select s.hier, s2.hier, s3.hier
from tblSample s join
tblSample s2
on s2.lvl = s.lvl + 1 and
s2.id = s.id join
tblSample s3
on s3.lvl = s2.lvl + 1 and
s3.id = s2.id
where s.lvl = 1;
Here 是一个 db<>fiddle.
我们也可以使用 PIVOT
但同样我们必须在旋转子句中提供某个最大值 level
并使其动态化,您需要考虑将其转换为 Dynamic Sql
(不幸的是我不太熟悉SQL服务器动态SQL)
select id
,[1] as hier1
,[2] as hier2
,[3] as hier3
from
(
select t1.hier,t1.lvl,t1.id
from tblsample t1
) src
pivot
(
max(hier)
for lvl in ([1], [2], [3])
) piv;