Sql 基于现有列中的数据创建新列
考虑一个跟踪维修的系统。我有一个包含客户数据和公共id键的表。我有第二个表,其中有一列显示每个id键上使用了哪种类型的修复部件以及使用了多少。它们的定义如下: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
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似乎正是我要找的。不过,我还在读书。