2013-06-11 5 views
1

Рассмотрим систему отслеживания ремонта. У меня есть таблица с данными клиента и общий ключ ключа. У меня есть вторая таблица со столбцом, чтобы показать, какой тип части ремонта использовался для каждого ключа id и сколько было использовано. Их определения приведены ниже:Создание новой колонки на основе данных из существующего столбца

order_information 
order_id | cust_last_name 
465   Smith 
899   Williams 
512   Johnson 
345   Fenton 
122   Bowles 
944   Cooper 

parts_usage 
order_id | part_type | part_quantity 
465   Part 1  5 
465   Part 2  4 
899   Part 1  2 
899   Part 2  8 
899   Part 3  6 
512   Part 3  1 
345   Part 2  4 
345   Part 3  5 
122   Part 2  3 
944   Part 1  2 

Я хотел бы выполнить запрос для отчета, который будет возвращать куски Пярта разбиты так:

order_id | Part 1 | Part 2 | Part 3 | Total 
465   5   4      9 
899   2   8   6   16 
512        1   1 
345      4   5   9 
122      3      3 
944   2        2 

Можно ли сделать это с помощью запроса так что в моих отчетах может отображаться, сколько из каждой части было использовано на каждом ремонтном билете?

Как вы можете видеть, каждый order_id может иметь несколько типов деталей и уникальные количества. Я хочу разбить разные типы элементов (у меня 3 всего) на 3 отдельных столбца, их итоговые значения перечислены order_id.

+0

Что вам нужно, чтобы повернуть стол. Например, SQL Server имеет команду Pivot: http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx –

+2

Какие СУБД вы используете. SQL - это всего лишь язык, используемый многими системами баз данных. Решение, которое вы ищете, скорее всего, будет специфичным для поставщика. – GarethD

+0

Если вы знаете, что у вас есть только три части, и они одинаковы, то перекрестная вкладка стиля 'sum (case, когда part_type = 'part 1', а затем part_quantity), поскольку Part1' должен работать - иначе более сложное решение, которое, вероятно, будет конкретный поставщик, как @GarethD. –

ответ

1
select order_id, [Part 1], [Part 2], [Part 3], Total 
from 
(
    select oi.order_id 
    , part_type 
    , part_quantity 
    , Total = sum(part_quantity) over (partition by oi.order_id) 
    from order_information oi 
    inner join parts_usage pu on oi.order_id = pu.order_id 
) as parts 
pivot 
(
    sum(part_quantity) for part_type in ([Part 1], [Part 2], [Part 3]) 
) as pvt 
order by order_id 

Это работает для меня.

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

Вы можете увидеть ключ, чтобы объединить PIVOT с функцией агрегатного окна SUM.

SQL Fiddle with demo.

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