SQL结果中的分层编号

时间:2016-07-08 19:43:45

标签: sql sql-server

我有一个查询在一些通常的分层数据上做了一些完整的连接。类别具有组,而组具有项目,但组和项目可以分别未附加到类别和组。我喜欢的结果如下:

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
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

虽然最后一行的1Io列中NULL列上NULL项的行也可能是I s。但是,孤儿项目行中的ACo非常重要。

编辑:这是为了便于阅读而从实际代码中简化。在我的情况下,Items可能包含0个或更多子项,因此每个Item可能有多行,其中GoIoCo 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 的值只是重复。子项目没有编号,因此它们没有序数列。所以一些完整行的示例如下所示:

FROM

我的问题有两个:

  • 如何为层次结构的每个级别执行不同的编号,并在该级别更改时使其递增?
  • 如何将这些数字转换为不同的序数空间(例如将1,2,3翻译成a,b,c或I,II,III)并按级别进行翻译?

这是在MS SQL Server 2012中。我只能访问SQL,因此T-SQL代码已经用完了。

作为参考,我的查询中的WHERErow_number over (order by...子句大约有20行代码,我想保留DRY。我之前使用过CTE,但我不确定在这种情况下是否有用。

我熟悉使用{{1}},但在这种情况下,我不知道如何使用它。

1 个答案:

答案 0 :(得分:2)

对于群组号码,我相信你想要DENSE_RANK。它的使用方式与ROW_NUMBER相同,但组除外。

在没有看到真实代码的情况下,它将是:

SELECT    DENSE_RANK() over (ORDER BY Category) as Co,
          Category,
          DENSE_RANK() over (PARTITION BY Category, ORDER BY [Group]) as Go,
          Group,
          --etc

那就是说,我不知道如何将数字转换成没有函数的数字/字母。