Sql 基于现有列中的数据创建新列

Sql 基于现有列中的数据创建新列,sql,sql-server,reporting,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 p

考虑一个跟踪维修的系统。我有一个包含客户数据和公共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
是否可以通过查询来执行此操作,以便我的报告可以显示每个维修通知单上使用了多少个零件

如您所见,每个
订单id
可以有多种零件类型和唯一数量。我想将不同的零件类型(我有3个总计)分成3个单独的列,它们的总计按
order\u id
列出

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
这对我有用

我也按
顺序id
对结果集进行了排序;在您的示例结果中似乎没有特定的顺序,但在问题详细信息中提到了它

您可以看到,关键是将
PIVOT
SUM
聚合窗口函数相结合

这对我有用

我也按
顺序id
对结果集进行了排序;在您的示例结果中似乎没有特定的顺序,但在问题详细信息中提到了它

您可以看到,关键是将
PIVOT
SUM
聚合窗口函数相结合


.

您需要的是旋转您的桌子。例如,SQLServer有Pivot命令:您正在使用什么RDBMS。SQL只是许多数据库系统使用的一种语言。您正在寻找的解决方案可能是特定于供应商的。如果您知道您只有三个零件,并且它们是相同的,那么请使用样式
sum的交叉选项卡(如果零件类型='part 1',则零件数量结束)正如第1部分所述,
应该可以工作-否则,一个更复杂的解决方案可能是特定于供应商的,如@GarethD所述。我的RDBMS是Microsoft SQL Server。谢谢,尤里,PIVOT似乎正是我要找的。不过还是在读书。你需要的是转动你的桌子。例如,SQLServer有Pivot命令:您正在使用什么RDBMS。SQL只是许多数据库系统使用的一种语言。您正在寻找的解决方案可能是特定于供应商的。如果您知道您只有三个零件,并且它们是相同的,那么请使用样式
sum的交叉选项卡(如果零件类型='part 1',则零件数量结束)正如第1部分所述,
应该可以工作-否则,一个更复杂的解决方案可能是特定于供应商的,如@GarethD所述。我的RDBMS是Microsoft SQL Server。谢谢,尤里,PIVOT似乎正是我要找的。不过,我还在读书。