如何以这种特定方式订购 sql 结果?
How to order a sql result in this specific way?
我有一个包含列(ID、ParentId、名称等)的 table。
parentId 可以为空。我想以这样的方式显示结果,首先它显示父级,然后在下一行显示它的子级。我怎样才能那样订购?我正在使用 Microsoft Sql 服务器
示例数据:
ID cltName parentId
----------- -------------------------------------------------- -----------
1 a NULL
2 b NULL
3 c NULL
4 d NULL
5 e NULL
6 f NULL
7 g 6
8 h NULL
9 i 3
10 k NULL
11 yyk NULL
12 krr NULL
13 krre 12
预期结果是:
ID cltName parentId
----------- -------------------------------------------------- -----------
6 f NULL
7 g 6
3 c NULL
9 i 3
12 krr NULL
13 krre 12
您需要为要组合在一起的所有行创建一个具有相同值的列 - 这是 parentid 或单位自己的 id(如果它没有父级)。然后计算每组中有多少行,并且仅显示计数大于 1 的行。这将为您提供正确的数据。然后按groupingID,parentID排序,真正排序。
With TestData as
(
select 1 as ID,'a' as cltName,NULL as parentId
union all select 2 ,'b',NULL
union all select 3 ,'c',NULL
union all select 4 ,'d',NULL
union all select 5 ,'e',NULL
union all select 6 ,'f',NULL
union all select 7 ,'g',6
union all select 8 ,'h',NULL
union all select 9 ,'i',3
union all select 10,'k',NULL
union all select 11,'yyk',NULL
union all select 12,'krr',NULL
union all select 13,'krre',12
), WorkingData as (
Select ID, cltName, parentId
, case when parentId IS NULL then ID else parentId end as groupingID
, COUNT (ID) OVER (PARTITION BY case when parentId IS NULL then ID else parentId end) as RowCt
from TestData
)
Select ID, cltName, parentId
From WorkingData
Where RowCt > 1
Order by groupingID, parentId
我有一个包含列(ID、ParentId、名称等)的 table。 parentId 可以为空。我想以这样的方式显示结果,首先它显示父级,然后在下一行显示它的子级。我怎样才能那样订购?我正在使用 Microsoft Sql 服务器
示例数据:
ID cltName parentId
----------- -------------------------------------------------- -----------
1 a NULL
2 b NULL
3 c NULL
4 d NULL
5 e NULL
6 f NULL
7 g 6
8 h NULL
9 i 3
10 k NULL
11 yyk NULL
12 krr NULL
13 krre 12
预期结果是:
ID cltName parentId
----------- -------------------------------------------------- -----------
6 f NULL
7 g 6
3 c NULL
9 i 3
12 krr NULL
13 krre 12
您需要为要组合在一起的所有行创建一个具有相同值的列 - 这是 parentid 或单位自己的 id(如果它没有父级)。然后计算每组中有多少行,并且仅显示计数大于 1 的行。这将为您提供正确的数据。然后按groupingID,parentID排序,真正排序。
With TestData as
(
select 1 as ID,'a' as cltName,NULL as parentId
union all select 2 ,'b',NULL
union all select 3 ,'c',NULL
union all select 4 ,'d',NULL
union all select 5 ,'e',NULL
union all select 6 ,'f',NULL
union all select 7 ,'g',6
union all select 8 ,'h',NULL
union all select 9 ,'i',3
union all select 10,'k',NULL
union all select 11,'yyk',NULL
union all select 12,'krr',NULL
union all select 13,'krre',12
), WorkingData as (
Select ID, cltName, parentId
, case when parentId IS NULL then ID else parentId end as groupingID
, COUNT (ID) OVER (PARTITION BY case when parentId IS NULL then ID else parentId end) as RowCt
from TestData
)
Select ID, cltName, parentId
From WorkingData
Where RowCt > 1
Order by groupingID, parentId