2014-02-06 2 views
0

У меня есть следующие настройки схемы:Группировка - нужно отобразить на одной строке

Имя таблицы: thing

Column | type 
---------------------------- 
id  | auto increment int 
ident | int 
cost1 | int 
cost2 | int 
cost3 | int 

Имя таблицы: thing_usage

column  | type 
--------------------------------- 
id   | auto increment int 
thing  | int - FK to thing.id 
usage_type | int 
data  | int 
duration | int 

с некоторыми данными:

thing:

id | ident | cost1 | cost2 | cost3 
------------------------------------------------ 
1  | 1234  | 1  | 2  | 3 
2  | 5678  | 0  | 0  | 0 

thing_usage:

id | thing  | usage_type | data | duration 
-------------------------------------------------------- 
1  | 1   | 1   | 5555  | 0 
2  | 1   | 1   | 3  | 0 
3  | 1   | 2   | 0  | 123 
4  | 1   | 3   | 232  | 12 

Все здесь ->SQLFiddle

То, что я хотел бы выход, если в одной строке для каждого thing как это:

thing | cost1 | usage1 | cost2 | usage2 | cost3 | usage3 
------------------------------------------------------------------------ 
1  | 1  | 5558  | 2  | 00:02:03 | 3  | 232 
2  | 0  | 0  | 0  | 0  | 0  | 0 

cost1 использует usage_type из, cost2 использует usage_type из 2 и так далее ...... и cost1 и cost3 использования data для его использования и cost2 преобразует duration от нескольких секунд до чч: мм: сс для использования - использование должно быть просуммирован

На момент я должен создать 2 запроса, и поэтому это в коде - поэтому я все петли thing, а затем получаю их использование и вывод соответственно

Есть ли способ получить желаемый результат из одного запроса - возможно, используя какой-нибудь подзапрос?

+0

Это называется «поворот» или «сводная таблица». Попробуйте найти поисковый запрос «msql pivot example». – DwB

+0

@ dwb thanks - я посмотрю ... я действительно пытался назвать это чем-то! теперь я знаю – ManseUK

+0

Я бы дал ответ, но каждый раз, когда мне это нужно, я всегда должен делать это. – DwB

ответ

0

Надеюсь, это то, что вы искали:

SELECT thing_usage1.id 
    ,thing.id 
    ,thing.cost1 
    ,SUM(thing_usage1.data) AS usage1 
    ,thing.cost2 
    ,TIME_FORMAT(SEC_TO_TIME(thing_usage2.duration),'%H:%i:%s') AS usage2 
    ,thing.cost3 
    ,SUM(thing_usage3.data) AS usage3 
FROM thing AS thing 
INNER JOIN thing_usage AS thing_usage1 ON thing.id = thing_usage1.thing 
    AND thing.cost1 = thing_usage1.usage_type 
INNER JOIN thing_usage AS thing_usage2 ON thing.id = thing_usage2.thing 
    AND thing.cost2 = thing_usage2.usage_type 
INNER JOIN thing_usage AS thing_usage3 ON thing.id = thing_usage3.thing 
    AND thing.cost3 = thing_usage3.usage_type 
GROUP BY thing_usage1.id 
    ,thing.id 
    ,thing.cost1 
    ,thing.cost2 
    ,thing.cost3 

Вот пример его работы: http://sqlfiddle.com/#!2/68f430/51

Обновлена ​​моя логика для учета части SUM, а также использования продолжительности.

+0

Почти ... вторая вещь отсутствует. И я только что обновил свой вопрос, так как мне нужно суммировать использование ...Извините, и стоимость не равна use_type - значение 'cost1' может быть 1000 и по-прежнему использовать' usage1' – ManseUK

+0

Обновлена ​​моя логическая и примерная ссылка для учета компонентов 'SUM'. – PlantTheIdea

+0

Но что, если cost1 равно 100 ... а как насчет строк использования 0? – ManseUK

0

Если вы хотите сделать это «вручную» здесь что-то, чтобы вы начали:

SELECT 
th.ident, 
th.cost1, 
SUM(tu.data) as usage1data 
FROM 
thing th 
JOIN thing_usage tu 
ON th.id = tu.thing 
WHERE tu.usage_type = 1 
GROUP BY th.id, tu.usage_type 

И этот запрос вы должны получить происходит сбор всех сумм в одном заявлении:

SELECT 
tu.thing, 
    SUM(CASE WHEN usage_type=1 THEN tu.data ELSE 0 END) AS usage1, 
    SUM(CASE WHEN usage_type=2 THEN tu.data ELSE 0 END) AS usage2, 
    SUM(CASE WHEN usage_type=3 THEN tu.data ELSE 0 END) AS usage3 
FROM 
    thing_usage tu 
+0

Но вот только я получаю один из видов использования? – ManseUK

+0

@ManseUK Очевидно, да. Вы можете взять это оттуда и распространить это решение на другие столбцы. Я добавлю еще один намек. – SebastianH

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