2016-09-19 4 views
0

У меня есть структура таблицы, как показано ниже. У каждого инструмента есть семья. Каждый инструмент может быть связан с несколькими семействами. Каждая семья может иметь несколько инструментов.sql сумма запроса по категории

| Tool | Family | TPT | 
-------------------------------------- 
| ToolA | FamilyA | TPT1 | 
| ToolA | FamilyB | TPT2 | 
| ToolA | FamilyC | TPT3 | 
| ToolB | FamilyA | TPT4 | 
| ToolB | FamilyB | TPT5 | 
| ToolC | FamilyB | TPT6 | 
| ToolD | FamilyD | TPT7 | 

Я хочу суммировать столбец ТРТ, как видно в результатах

ценам ниже
| Family | TPT   | 
------------------ 
| FamilyA | TPT2+TPT3+TPT5 | 
| FamilyB | TPT1+TPT3+TPT4 | 
| FamilyC | TPT1+TPT2  | 
| FamilyD | 0    | 

Объяснение для FamilyA имеет конкретные результаты ToolA и ToolB. ToolA связан с FamilyB (TPT2), FamilyC (TPT3) и самой FamilyA. ToolB связан с самим FamiltyA и FamilyB (TPT5). Таким образом, TPT для FamilyA - TPT2 + TPT3 + TPT5. То же самое для FamilyB, FamilyC. FamilyD имеет только ToolD. ToolD не имеет отношения ни к какой другой семье. Таким образом, TPT для FamilyD равен 0. Как написать sql-запрос, который будет получать эти результаты, используя указанную выше структуру таблицы?

+0

Вы пытались написать код для решения этой проблемы? – dfundako

+0

Мне нужно сделать это в sql-запросе –

+1

, который rdbms? что вы попробовали? Какая у вас ошибка? вы искали SO (через SO-search и google)? На этот вопрос есть тонны этого вопроса ... Должно быть хотя бы одно решение вашего вопроса. – swe

ответ

0

Надеется, что это будет работать для вас, как я не проверял:

SELECT a.family, coalesce(sum(b.tpt), 0) AS total 
FROM tbl AS a 
LEFT JOIN tbl AS b ON a.tool = b.tool AND a.family != b.family 
GROUP BY a.family 
+0

. Названия столбцов в верхней части являются двусмысленными, и вы получите NULL для семьи D вместо 0, но в остальном выглядите идентично шахте – kbball

+0

Исправлено. Спасибо за предложение ... :) –

0

Вот еще один, который является немного более точным:

SELECT t1.family, coalesce(SUM(t2.tpt),0) 
FROM t t1 
LEFT JOIN t t2 
ON t1.tool = t2.tool 
AND t1.family <> t2.family 
GROUP BY t1.family 

Испытано здесь: http://sqlfiddle.com/#!9/a0dca/7