根据现有列中的数据创建新列

时间:2013-06-11 15:54:18

标签: sql sql-server reporting

考虑一个跟踪维修的系统。我有一个包含客户数据和常用ID密钥的表。我有一个第二个表,其中有一列用于显示每个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列出。

1 个答案:

答案 0 :(得分: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排序了结果集;在您的示例结果中似乎没有特定的顺序,但在问题详细信息中提到了它。

您可以看到关键是将PIVOTSUM聚合窗口功能结合起来。

SQL Fiddle with demo