SQL结果中的分层编号
我有一个查询,它对一些一般层次结构的数据进行了一些完全联接。类别有组,组有项目,但组和项目可以分别独立于类别和组。我想要的结果如下所示:SQL结果中的分层编号,sql,sql-server,Sql,Sql Server,我有一个查询,它对一些一般层次结构的数据进行了一些完全联接。类别有组,组有项目,但组和项目可以分别独立于类别和组。我想要的结果如下所示: I. NULL A. NULL 1. Item Orphan <-- no category or group B. Group Red <-- no category 1. Item Apple 2. Item Banana II. Category Bacon A. Group Blue B. Group
I. NULL
A. NULL
1. Item Orphan <-- no category or group
B. Group Red <-- no category
1. Item Apple
2. Item Banana
II. Category Bacon
A. Group Blue
B. Group Taupe
1. Item Kiwi
2. Item Watermelon
III. Category Atari
A. Group Silver
IV. Category Maui
...
Category Group Item
NULL NULL Orphan
NULL Red Apple
NULL Red Banana
Bacon Blue NULL
Bacon Taupe Kiwi
Bacon Taupe Watermelon
Atari Silver NULL
Maui NULL NULL
Co Category Go Group Io Item Supplier Supplier_phone
I NULL B Red 2 Banana NULL NULL
II Bacon B Taupe 1 Kiwi Steve 555-1234
II Bacon B Taupe 1 Kiwi Sally 555-4242
II Bacon B Taupe 2 Watermelon NULL NULL
我需要的是:
Co Category Go Group Io Item
I NULL A NULL 1 Orphan
I NULL B Red 1 Apple
I NULL B Red 2 Banana
II Bacon A Blue 1 NULL
II Bacon B Taupe 1 Kiwi
II Bacon B Taupe 2 Watermelon
III Atari A Silver 1 NULL
IV Maui A NULL 1 NULL
尽管如此,最后一行上的A
和Io
列中的1
s以及NULL
项目行上的NULL也可以是s。不过,孤立项行上的I
和A
很重要
编辑:这是从实际代码简化为可读性。在我的例子中,项目可能有0个或多个子项目,因此每个项目可能有多行,Co
、Go
和Io
的值将简单地复制。但是子项没有编号,因此它们没有序号列。因此,一些整行的示例如下所示:
I. NULL
A. NULL
1. Item Orphan <-- no category or group
B. Group Red <-- no category
1. Item Apple
2. Item Banana
II. Category Bacon
A. Group Blue
B. Group Taupe
1. Item Kiwi
2. Item Watermelon
III. Category Atari
A. Group Silver
IV. Category Maui
...
Category Group Item
NULL NULL Orphan
NULL Red Apple
NULL Red Banana
Bacon Blue NULL
Bacon Taupe Kiwi
Bacon Taupe Watermelon
Atari Silver NULL
Maui NULL NULL
Co Category Go Group Io Item Supplier Supplier_phone
I NULL B Red 2 Banana NULL NULL
II Bacon B Taupe 1 Kiwi Steve 555-1234
II Bacon B Taupe 1 Kiwi Sally 555-4242
II Bacon B Taupe 2 Watermelon NULL NULL
我的问题有两个:
- 如何为层次结构的每个级别进行不同的编号,并在该级别更改时使其递增
- 如何将这些数字转换为不同的顺序空间(例如,将1、2、3转换为a、b、c或I、II、III),并按级别进行转换
这是在MS SQL Server 2012中。我只能访问SQL,所以T-SQL代码已经过时了
作为参考,我查询中的FROM
和WHERE
子句共有大约20行代码,我希望保持干燥。我以前使用过CTE,但我不确定这在这种情况下是否有用
我熟悉使用row\u number over(order by…
),但我不知道如何在这种情况下使用它。对于组号,我相信您需要密集排列
。它的使用方式与row\u number
相同,除了组
在看不到真实代码的情况下,它将类似于:
SELECT DENSE_RANK() over (ORDER BY Category) as Co,
Category,
DENSE_RANK() over (PARTITION BY Category, ORDER BY [Group]) as Go,
Group,
--etc
也就是说,我不知道如何在没有函数的情况下将数字转换为数字/字母。在层次结构中永远不会有低于项的级别?我从实际用例中简化了它,但确实会有。我会更新问题以反映这一点。这是一个好的决定,因为这感觉就像是一个可以产生重大影响的问题很大的不同。谢谢!我以前在复制/粘贴/修改中使用的行数
代码中没有真正掌握不同的关键字。现在我终于明白了按
划分和按
排序以及在密集等级
中做了什么。至于转换,我想我可以在消耗查询结果,但如果必须,我可能会使用CASE
语句在有限范围内得到一些糟糕的翻译,如果必须的话:再次感谢。@jinglesthula很高兴这有帮助,那些“aha”时刻是最好的。我非常希望翻译在代码中可以管理,因为我不希望这些情况发生对任何人的提示:D祝你好运。谢谢。我能够翻译代码中的罗马数字(谢天谢地!)。为了避免任何人使用谷歌搜索,我编写的罗马数字算法就是其中的一个端口