Детализировать / дезагрегировать сводную таблицу данных - PullRequest
0 голосов
/ 28 марта 2019

У меня есть таблица агрегированных данных:

KWid     Orders    Revenue
12345    10        150
23468    5         200

Эти данные хранятся в отчетах одного поставщика, но мы переходим на нового поставщика.Для получения транзакционных данных новому поставщику требуется, чтобы каждый заказ, перечисленный в одной строке, то есть, если KWid 23468 с 5 заказами будет выглядеть следующим образом:

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 строк.Кроме того, для каждой отдельной строки необходимо создать уникальный идентификатор заказа.

Я делал это в прошлом, но, похоже, нигде не могу найти свой код.Как мне выполнить следующие условия:

  1. Необходимо в SQL Server или Python
  2. Невозможно включить таблицу счетчиков, как показано в этом решении (слишком много транзакций для создания такой таблицы).эффективно) - разбить сводную таблицу в SQL Server 2008

1 Ответ

1 голос
/ 28 марта 2019

Присоединение к таблице подсчета делает это довольно простым. Вы можете узнать больше о таблицах подсчета здесь .

Я сохраняю один вид моей системы. Вот моя версия.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...