2015-10-01 5 views
0

Мне нужно добавить сумму дочерних элементов в родительский элемент. Детский элемент childId 'аналогичен родительскому элементу' parentId '.Sql Сумма дочерних элементов

В приведенной ниже таблице ParentId '45627' имеет общее количество 0. Но мне нужно, как 11. 11 - сумма детальных предметов totalcount.

+----------+---------+-------+------------+ 
| ParentId | ChildId | Name | TotalCount | 
+----------+---------+-------+------------+ 
| 45627 | 12568 | Test1 |   0 | 
| 52678 | 45627 | Test2 |   0 | 
| 23123 | 45627 | Test3 |   7 | 
| 54312 | 45627 | Test4 |   3 | 
| 32123 | 45627 | Test5 |   0 | 
| 12111 | 45627 | Test6 |   1 | 
| 32122 | 45627 | Test7 |   0 | 
| 43123 | 45627 | Test8 |   0 | 
+----------+---------+-------+------------+ 

Ожидаемый результат:

+----------+---------+-------+------------+ 
| ParentId | ChildId | Name | TotalCount | 
+----------+---------+-------+------------+ 
| 45627 | 12568 | Test1 |   11 | 
| 52678 | 45627 | Test2 |   0 | 
| 23123 | 45627 | Test3 |   7 | 
| 54312 | 45627 | Test4 |   3 | 
| 32123 | 45627 | Test5 |   0 | 
| 12111 | 45627 | Test6 |   1 | 
| 32122 | 45627 | Test7 |   0 | 
| 43123 | 45627 | Test8 |   0 | 
+----------+---------+-------+------------+ 

Хотя я в состоянии достигнуть с автообъединением но производительность слишком медленно.

Есть ли другой способ получить ожидаемый результат с лучшей производительностью.

Запросов Я попытался

SELECT a.parentId 
    ,a.childId 
    ,out1.TotalCount 
FROM test a 
LEFT JOIN (
    SELECT a.parentId 
     ,sum(b.TotalCount) AS TotalCount 
    FROM test a 
    INNER JOIN test b ON a.ParentId = b.childId 
    GROUP BY a.ParentId 
    ) AS out1 ON a.ParentId = out1.ParentId 

Примечание: В приведенных выше таблицах приведены примеры. Количество записей может составлять 10 000.

Извините за плохую разметку.

+1

Показать, что вы попробовали. Таким образом, мы можем предоставить вам другие варианты, а не повторять те, которые вы уже пробовали. –

+0

хотел его только для SQL-SERVER, или любая РСУБД будет делать? –

+1

Я думаю, что у вас есть обратная сторона ChildID и ParentID? 45627 выглядит как родитель всех этих детей. Но мы можем дождаться результата dna. –

ответ

0

Если я правильно понимаю ваши потребности этот запрос Шоул соответствовать вашим ожиданиям:

SELECT x.parentId, 
     x.childId, 
     CASE WHEN x.total > 0 THEN x.total ELSE x.TotalCount END AS Total 
FROM  
    (SELECT a.parentId 
      ,a.childId, 
      ,a.TotalCount 
      ,(SELECT SUM(b.TotalCount) FROM test b WHERE b.childId = a.parentId) AS total 
    FROM test a) x 
+0

Но это будет обновлять totalcount для всех записей. Мне нужен только родитель. Надеюсь, что мой ожидаемый результат отличается от вашего запроса. – Bullet

+0

Я исправил запрос. –

0

Столбец имена не имеют никакого смысла, входные данные не имеют никакого смысла, (но это спорно,) и желаемый выход не и любой смысл. Вот почему этот вопрос пока не получил ответов.

Предполагая, что в первую очередь «ParentId» был переименован в «Id», а «ChildId» был переименован в «ParentId», так что модель имеет смысл, и поэтому тип данных имеет смысл, тогда следующее:

CREATE TABLE TEST 
(
    Id INTEGER, 
    ParentId INTEGER, 
    Name NVARCHAR(100), 
    TotalCount INTEGER 
); 

INSERT INTO TEST(Id, ParentId, Name, TotalCount) VALUES(45627, 12568, 'Test1', 0); 
INSERT INTO TEST(Id, ParentId, Name, TotalCount) VALUES(52678, 45627, 'Test2', 0); 
INSERT INTO TEST(Id, ParentId, Name, TotalCount) VALUES(23123, 45627, 'Test3', 7); 
INSERT INTO TEST(Id, ParentId, Name, TotalCount) VALUES(54312, 45627, 'Test4', 3); 
INSERT INTO TEST(Id, ParentId, Name, TotalCount) VALUES(32123, 45627, 'Test5', 0); 
INSERT INTO TEST(Id, ParentId, Name, TotalCount) VALUES(12111, 45627, 'Test6', 1); 
INSERT INTO TEST(Id, ParentId, Name, TotalCount) VALUES(32122, 45627, 'Test7', 0); 
INSERT INTO TEST(Id, ParentId, Name, TotalCount) VALUES(43123, 45627, 'Test8', 0); 

SELECT Parent.Id, SUM(Child.TotalCount) AS Total 
    FROM TEST AS Parent 
     LEFT JOIN TEST As Child ON Parent.id = Child.ParentId 
GROUP BY Parent.Id; 

производит следующий вывод:

Id, Total 
12111, NULL 
23123, NULL 
32122, NULL 
32123, NULL 
43123, NULL 
45627, 11 
52678, NULL 
54312, NULL 

что является правильным выходом для заданных входных данных, и в соответствии с приведенными выше предположениями.

Также возможно получить 11 для 45627, что и требовалось ОП.

Если вопрос будет отредактирован, чтобы иметь смысл, я буду соответствующим образом изменить свой ответ.

Смежные вопросы