2013-06-11 96 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

您使用的是什麼RDBMS。 SQL只是許多數據庫系統使用的語言。您正在尋找的解決方案可能是供應商特定的。 – GarethD

+0

如果你知道你只有三個部分,並且它們是相同的,那麼作爲Part1'應該可以工作的樣式'sum(當part_type ='part 1'時part_quantity結束的情況下)的交叉表格 - 否則可能是更復雜的解決方案供應商特定爲@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的結果集;在您的示例結果中似乎沒有特定的順序,但在問題詳細信息中提到了它。

您可以看到關鍵是將PIVOTSUM聚合窗口函數組合在一起。

SQL Fiddle with demo

相關問題