2012-02-17 134 views
0

我遇到了一個查詢問題,我並不完全確定可以使用數據庫的設置方式。基本上,我會在查詢中使用兩個不同的表格,比如說交易和票價。他們看起來像這樣(有一些示例數據):在查詢中合併兩個表並從中創建新列

TRANSACTIONS 
    Transation ID | Ticket Quantity | Total Price | Salesperson | Ticket Price ID 
     5489    250   250   Jim    8765 
     5465    50    150   Jim    1258 
     7898    36    45    Ann    4774 


    Ticket Prices 
    Ticket Price ID | Quantity | Price | Bundle Name 
     8765   1   1   1 ticket, $1 
     4774   12   15  5 tickets, $10 
     1258   1   3   1 ticket, $3 

什麼我的目標是一份報告,通過捆綁式分解每個銷售人員的銷售。結果表應該是這樣的:

Sales Volume/Salesperson 
Name | Bundle A | Bundle B | Bundle C | Total 
Jim  250   0   50  300 
Ann  0   36   0  36 

我一直在尋找的網站,它似乎越來越像,這是使用各種子查詢的最佳途徑,這遠作品以及獲得的列標題正確顯示,但不會達到實際的數字總和。它基本上結合了數據,給每個銷售員一個總讀數(在這個例子中,Jim和Ann在Bundle A中有250個銷售,在Bundle B中有36個,等等)。有什麼方法可以編寫一個能夠給我正確結果的查詢嗎?或甚至至少接近它?感謝您的任何意見。

+0

是否有一個1:「捆綁」在搜索結果和'門票價格之間一對一的關係ID'在你的'TICKET_PRICES'表中?如果是這樣,你怎麼知道'Ticket Price ID' 8765是「Bundle A」?如果TICKET_PRICES表中有多於3行,會發生什麼情況?你想在你的輸出中有更多的列嗎? – 2012-02-17 20:32:37

+0

使用sql server你可以做到這一點使用跨應用計算和動態創建列,不知道這是否可能在oracle? – Standage 2012-02-17 20:54:27

+0

@JustinCave目前,我沒有辦法知道這一點,我想先用「硬編碼」的數值得到一個基本的結構。理想的是,是的。我希望在輸出中包含與不同捆綁包中一樣多的列。 – Linkmaster94 2012-02-17 21:08:56

回答

0

您可以在Oracle中使用PIVOT語句來執行此操作。查詢可能是這個樣子:

WITH pivot_data AS (
      SELECT t.salesperson,p.bundle_name,t.ticket_quantity 
      FROM ticket_prices p, transactions t 
      where t.ticket_price_id = p.ticket_price_id 
     ) 
    SELECT * 
    FROM pivot_data 
    PIVOT (
      sum(ticket_quantity)  --<-- pivot_clause 
     FOR bundle_name   --<-- pivot_for_clause 
     IN ('1 ticket, $1','5 tickets, $10', '1 ticket, $3') --<-- pivot_in_clause 
     ); 

這將使你的結果是這樣的:

enter image description here

+0

這看起來很有希望。即使我不知道有多少包,或者有沒有名字,這仍然可以工作嗎? – Linkmaster94 2012-02-17 21:34:34

+0

語法允許您指定IN(ANY)或IN(),但似乎只有在您使用PIVOT XML而不是PIVOT時纔有效。來自PIVOT XML的結果將是SALESPERSON和BUNDLE_NAME_XML的列表,而不是您使用PIVOT時的常規查詢結果。 – GTG 2012-02-18 10:00:58