2012-02-17 98 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