逐项/分解汇总数据表

时间:2019-03-28 18:53:21

标签: python sql-server aggregate

我有一个汇总数据表:

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。

我过去曾经这样做过,但是似乎无法在任何地方找到我的代码。我将如何完成以下规定:

  1. 必须在SQL Server或Python中使用
  2. 不能包含此解决方案中所示的计数器表(太多的事务无法有效地创建这样的表)-disaggregate summarised table in SQL Server 2008

1 个答案:

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