我有一个查询在一些通常的分层数据上做了一些完整的连接。类别具有组,而组具有项目,但组和项目可以分别未附加到类别和组。我喜欢的结果如下:
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
虽然最后一行的1
和Io
列中NULL
列上NULL
项的行也可能是I
s。但是,孤儿项目行中的A
和Co
非常重要。
编辑:这是为了便于阅读而从实际代码中简化。在我的情况下,Items可能包含0个或更多子项,因此每个Item可能有多行,其中Go
,Io
和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
的值只是重复。子项目没有编号,因此它们没有序数列。所以一些完整行的示例如下所示:
FROM
我的问题有两个:
这是在MS SQL Server 2012中。我只能访问SQL,因此T-SQL代码已经用完了。
作为参考,我的查询中的WHERE
和row_number over (order by...
子句大约有20行代码,我想保留DRY。我之前使用过CTE,但我不确定在这种情况下是否有用。
我熟悉使用{{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
那就是说,我不知道如何将数字转换成没有函数的数字/字母。