Как выполнить свертку одной таблицы в SQL Server и свернуть дочерние таблицы, чтобы правильно ссылаться на свернутые родительские строки в SQL Server

#sql #sql-server #rollup

#sql #sql-сервер #свертка

Вопрос:

В нашей базе данных есть несколько таблиц, которые в значительной степени растут бесконечно, поэтому мы пытаемся создать задачу, которая будет периодически (возможно, ежедневно) свертывать старые данные и удалять записи, содержащиеся в свертке.

Это достаточно легко сделать, просто используя GROUP BY . Загвоздка в том, что это дочерние таблицы, которые также необходимо свернуть и ссылаться на новые заполненные строки родительской таблицы, на которые они ссылаются, и я понятия не имею, как это сделать, не выполняя некоторые действительно неудачные подзапросы.

В качестве примера скажем, я начинаю со следующих данных в двух таблицах:

Родительская таблица (ID — столбец идентификатора)

 ID  Type  Amount
--  ----  ------
 1     1   10.00
 2     1    3.00
 3     3    8.00
 4     3    9.00
 

Дочерняя таблица

 ParentID  Thing  Qty
--------  -----  ---
       1      8    3
       1      6    6
       2      8    4
       2      5    3
       3      8    2
       3      5    1
       4      5    4
 

Сначала я бы свернул родительскую таблицу в новые строки, которые сгруппированы по типу, а затем суммы суммируются вместе, что даст следующее:

 ID  Type  Amount
--  ----  ------
 5     1   13.00
 6     3   17.00
 

Запрос для создания вышеуказанных данных в родительском запросе будет выглядеть примерно следующим образом:

 INSERT INTO Parent (Type, Amount)
SELECT Type, SUM(Amount) AS Amount
FROM Parent
GROUP BY Type
 

Для дочерней таблицы я хочу сделать что-то подобное, за исключением группировки по «Thing» и суммирования количества с родительским идентификатором, ссылающимся на вновь созданный родительский элемент, который соответствует исходному родительскому элементу. Это создало бы что-то вроде следующего:

 ParentID  Thing  Qty
--------  -----  ---
       5      8    7
       5      5    3
       5      6    6
       6      5    5
       6      8    2
 

Этот запрос будет выглядеть примерно так, как показано ниже, но я не знаю, как получить родительский идентификатор или как связать с родительской таблицей:

 INSERT INTO Child (ParentID, Thing, Qty)
SELECT ?, Thing, SUM(Qty) AS Qty
FROM Child
INNER JOIN Parent
    ON ? = ?
GROUP BY ?, Thing
 

Я бы предположил, что это происходит довольно часто, так что кто-нибудь знает, как правильно справиться с этой ситуацией?

Комментарии:

1. Родительский. Тип и дочерний элемент. Группа равна? Я имею в виду, что они называются differentlt, но ссылаются ли они на один и тот же контент?

2. Можете ли вы, пожалуйста, проверить запрос, приведенный ниже, и получить ответ

3. Родитель. Тип и Ребенок. Группа не предназначена для какой-либо связи. Это всего лишь некоторые случайные данные, которые я составил. Они могут иметь любое значение.

4. Я изменил данные примера, чтобы столбец группы назывался «Thing», чтобы избежать путаницы с SQL group, а также чтобы было ясно, что Type и Thing не коррелируют друг с другом.

Ответ №1:

Первая таблица:

 Declare @max int = (Select MAX(ID) from parent)
Select @max

Select @max R ID,type,Amount
from 
(
Select type,sum(amount) 'Amount',ROW_NUMBER() over(order by type) 'R'
from parent
group by Type
) R
 

Вторая таблица:

 Select @max TYPE 'ParentID',[group],sum(Qty) 'Qty'
from child
join parent 
on id = parentid
group by type,[group]
order by [parentid],[group]
 

Комментарии:

1. Интересная теория, но type не гарантированно начинается с определенного значения или включает все значения в последовательности (они могут быть 2, 5, 7) или что-то в этом роде.

2. Не совпадает ли тип с типом родительской таблицы?

3. Родительская таблица имеет тип. Дочерняя таблица имеет группу. Они не связаны.

4. Можете ли вы отредактировать требуемые данные и выходные данные, чтобы я мог их очистить

5. Измените данные родительской таблицы и дочерней таблицы , вывод которых требуется соответствующим образом, если вы считаете, что это будет исключением