如何使用表来旋转,链接和分组表

时间:2017-08-09 15:13:35

标签: sql-server sql-server-2012

我有一张表 beta ,其中包含cols Id,Parent,Name,Level

CREATE TABLE [beta](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Parent] [int] NULL,
[Name] [varchar](150) NOT NULL,
[Level] [int] NULL,
 CONSTRAINT [PK_Beta] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

示例内容

Id Parent   Name             Level
1   NULL    Clinical         1
2   NULL    Custom           1
3   NULL    Medicare         1
4   NULL    Validation       1
5   1       Medicaid         2
6   2       CD               2
7   3       Specialty        2
8   5       Fraud            3
9   2       Institutional    3
10  8       Professional     4

我很独特。最多有4个级别。每个姓名'可以追溯到1级.1级'父母'永远是NULL。

我正在尝试检索结果sot看起来像这样

Level1   Level2   Level3 Level4       Id
Clinical Medicaid Fraud  Professional 1, 5, 8, 10
Custom   CD       NULL   NULL         2, 6
...............

或者像这样

Level1   Level2   Level3 Level4       Level1Id Leve2Id Level3Id Level4Id
Clinical Medicaid Fraud  Professional 1        5       8        10
Custom   CD       NULL   NULL         2        6       NULL     NULL
...............

我如何在SQL查询中获得此信息

1 个答案:

答案 0 :(得分:1)

如果您有固定数量的级别

示例

Declare @YourTable Table ([Id] int,[Parent] int,[Name] varchar(50),[Level] int)
Insert Into @YourTable Values 
 (1,NULL,'Clinical',1)
,(2,NULL,'Custom',1)
,(3,NULL,'Medicare',1)
,(4,NULL,'Validation',1)
,(5,1,'Medicaid',2)
,(6,2,'CD',2)
,(7,3,'Specialty',2)
,(8,5,'Fraud',3)
,(9,2,'Institutional',3)
,(10,8,'Professional',4)

;with cteP as (
      Select Id
            ,Parent 
            ,PathID = cast(Id as varchar(500))
            ,PathNm = cast(name as varchar(500))
      From   @YourTable
      Where  Parent is null
      Union  All
      Select Id  = r.Id
            ,Parent  = r.Parent 
            ,PathID = cast(p.PathID+', '+cast(r.Id as varchar(25)) as varchar(500))
            ,PathNm = cast(p.PathNm+'||'+r.name as varchar(500))
      From   @YourTable r
      Join   cteP p on r.Parent  = p.Id)
Select B.*
      ,ID = A.PathID
 From  cteP A
 Cross Apply (
                Select Level1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                      ,Level2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                      ,Level3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                      ,Level4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
                From  (Select Cast('<x>' + replace((Select replace(PathNm,'||','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as X 
             ) B
 Order by A.PathID

<强>返回

enter image description here