我与由与计数项目编号分组数据的工作。 与每个记录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
出于某种原因,我不能换我的头周围干净的方式做到这一点(或任何方式)。
您可以使用公用表表达式管理
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指出
嗯....我想我喜欢这个递归的热膨胀系数:
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
您可避免与下面的查询递归,我想会更有效率。 在这里,表N是至少为多行作为国内最大的CountOfItems值的任何表。
这是一个查询,其中没有ORDER BY TOP是不是一个坏主意的一个罕见的例子。
select
OwnerNumber,
ItemCode,
ItemNumber
from t
cross apply (
select top (CountOfItems) null
from N
) as N(c)