我有一个汇总数据表:
KWid Orders Revenue
12345 10 150
23468 5 200
此数据存储在一个供应商的报告中,但是我们正在迁移到新的供应商。要提取交易数据,新供应商需要在一行上列出每个订单,即带有5个订单的KWid 23468将显示如下:
KWid Orders Revenue OrderID
23468 1 40 1
23468 1 40 2
23468 1 40 3
23468 1 40 4
23468 1 40 5
请注意,这5个订单(200)的总收入在5行中平均分配。另外,必须为每一行创建唯一的订单ID。
我过去曾经这样做过,但是似乎无法在任何地方找到我的代码。我将如何完成以下规定:
答案 0 :(得分:0)
加入统计表可以使这一过程变得非常简单。您可以了解有关理货单here的更多信息。
我在系统上保留一个视图。这是我的版本。
create View [dbo].[cteTally] as
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N from cteTally
GO
接下来,我们需要一个与您的表一起使用的表,所以我只将快速表变量扔在一起。在查询中,您可以在基表中编写此代码。
declare @Something table (KWid int, Orders int, Revenue decimal(7,2))
insert @Something values
(12345, 10, 150)
, (23468, 5, 200)
现在我们有了问题的设置,这变得相当容易。此查询应生成您想要的数据。
select s.KWid
, OrderNum = t.N
, Revenue = convert(numeric(7, 2), round(s.Revenue / s.Orders, 2))
from @Something s
join cteTally t on t.N <= s.Orders
order by s.KWid
, t.N