如何旋转、链接和分组表格 [英] How to pivot, link and group a table with

查看:25
本文介绍了如何旋转、链接和分组表格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个表 beta,其中包含列 ID、父级、名称、级别

I have a table beta with 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

Id 是唯一的.最多有 4 个级别.每个 'Name' 都可以追溯到级别 1.级别 1 'Parent' 始终为 NULL.

Id is unique. There are up to 4 levels. Each 'Name' can be traced back to level 1. Level 1 'Parent' is always NULL.

我正在尝试检索这样的结果

I am trying to retrieve result sot look like this

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 查询中得到这个

How do i get this in SQL query

推荐答案

如果你有固定数量的关卡

If you have a fixed number of levels

示例

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

退货

这篇关于如何旋转、链接和分组表格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆