反向/吹了GROUP BY(Reverse/Blow out a GROUP BY)

2019-10-16 14:56发布

我与由与计数项目编号分组数据的工作。 与每个记录count > 2需要被吹出到个别记录,并在该电平到不同的组数据比较。

数据看起来是这样的(这是停留在这种格式这是客户可以发送它的唯一方法。):

OwnerNumber ItemCode    ItemNumber  CountOfItems
1234    Item1   Item1-001   3
1234    Item1   Item1-002   1
1234    Item1   Item1-003   2
1234    Item2   Item2-001   1

我需要此格式的数据(动态没有硬编码为CountOfItems的值):

OwnerNumber ItemCode    ItemNumber  
1234    Item1   Item1-001
1234    Item1   Item1-001
1234    Item1   Item1-001
1234    Item1   Item1-002
1234    Item1   Item1-003
1234    Item1   Item1-003
1234    Item2   Item2-001

出于某种原因,我不能换我的头周围干净的方式做到这一点(或任何方式)。

Answer 1:

您可以使用公用表表达式管理

WITH CTE AS (
    SELECT OwnerNumber,ItemCode,ItemNumber,CountOfItems FROM table

    UNION ALL SELECT OwnerNumber,ItemCode,ItemNumber,CountOfItems-1
    FROM CTE
    WHERE CountOfItems >= 2
)
SELECT OwnerNumber,ItemCode,ItemNumber
FROM CTE
ORDER BY ItemNumber
OPTION (MAXRECURSION 0);

编辑:

新增MAXRECURSION来处理情况CountOfItems超过默认最大递归的情况下,通过Dev_etter指出



Answer 2:

嗯....我想我喜欢这个递归的热膨胀系数:

WITH Data (OwnerNumber, ItemCode, ItemNumber, CountOfItems) as (
           SELECT OwnerNumber, ItemCode, ItemNumber, CountOfItems
           FROM OriginalTable
           UNION ALL
           SELECT OwnerNumber, ItemCode, ItemNumber, CountOfItems - 1
           FROM Data
           WHERE CountOfItems > 1)
SELECT OwnerNumber, ItemCode, ItemNumber
FROM Data
ORDER BY OwnerNumber, ItemCode, ItemNumber


Answer 3:

您可避免与下面的查询递归,我想会更有效率。 在这里,表N是至少为多行作为国内最大的CountOfItems值的任何表。

这是一个查询,其中没有ORDER BY TOP是不是一个坏主意的一个罕见的例子。

select
  OwnerNumber,
  ItemCode,
  ItemNumber
from t
cross apply (
  select top (CountOfItems) null
  from N
 ) as N(c)


文章来源: Reverse/Blow out a GROUP BY