2012-07-29 86 views
1

您好我想从3个不同的表中获得一个特定的值。每个表具有相同的结构,但包含一年不同时期的数据。在oracle中多选择SELECT

Temp_Table_Jun (Contains data for June month) 
--------------- 
CustNo CustName Revenue 
1000  John  5.55 

与之相似,我有两个更多的表

  • Temp_table_Apr
  • Temp_table_May

现在我运行一个查询

select sum(Revenue)Rev_June from Temp_Table_Jun where CustNo='1000' 

得到的结果6月进行。现在我的问题是我想在单个查询中获取全部月份的收入详情。

我需要这样的东西,(这是错误的并不起作用)

select Rev_June,Rev_Apr,Rev_May,((Rev_June+Rev_Apr+Rev_May)/3)Avg_3_Mon from 
(
     select sum(Revenue)Rev_June from Temp_Table_Jun where CustNo='1000', 
     select sum(Revenue)Rev_Apr from Temp_Table_Apr where CustNo='1000', 
     select sum(Revenue)Rev_May from Temp_Table_May where CustNo='1000' 

) 

如何才能实现这一目标?我正在使用Oracle 10g。提前致谢。

回答

5

为了让你可以做到这一点通过以下方式中的数据。 Oracle 10g中没有一个PIVOT但你可以使用CASE语句复制功能:

SELECT sum(case when month = 'June' then Rev END) June 
    , sum(case when month = 'May' then Rev END) May 
    , sum(case when month = 'April' then Rev END) April 
    , avg(Rev) as Average 
FROM 
(
    SELECT sum(revenue) Rev, 'June' as Month from rev_june where cust_no = '1000' 
    union all 
    SELECT sum(revenue) Rev, 'April' from rev_apr where cust_no = '1000' 
    union all 
    SELECT sum(revenue) Rev, 'May' from rev_may where cust_no = '1000' 
) x 

SQL Fiddle with Demo

或者你也可以做到以下几点:

SELECT June, April, May, (June + April + May)/3 as Average 
FROM 
(
    select 
    (SELECT sum(revenue) from rev_june where cust_no = '1000') as June 
    , (SELECT sum(revenue) from rev_apr where cust_no = '1000') as April 
    , (SELECT sum(revenue) from rev_may where cust_no = '1000') as May 
    from dual 
) x 

SQL Fiddle with Demo

+1

+1,'avg(Rev)'和'sum(Rev)/ count(rev)'一样好。 – 2012-07-29 21:40:22

+0

你是对的...再次! – Taryn 2012-07-29 23:04:40

+0

@bluefeet伟大的答案bluefeet - 我想不出如何做到从行到列的支点 – DavidHyogo 2012-07-30 06:22:34

1

我不知道,如果它在Oracle 10g中,但UNION查询大致是以下通常会在数据库中的工作,我曾经使用过:

select sum(Revenue) Rev_June from Temp_Table_Jun where CustNo='1000' 
UNION 
select sum(Revenue) Rev_Apr from Temp_Table_Apr where CustNo='1000' 
UNION 
select sum(Revenue) Rev_May from Temp_Table_May where CustNo='1000' 

我不crysal明确标点符号 - 你在末尾需要一个分号吗? - 但那可能会让你开始。

我想我会做到这一点略有不同,因为每个查询必须具有相同的结构UNION查询工作:

select sum(Revenue) Revenue_Sum, 'Jun' Month from Temp_Table_Jun where CustNo='1000' 
UNION 
select sum(Revenue) Revenue_Sum, 'Apr' Month from Temp_Table_Apr where CustNo='1000' 
UNION 
select sum(Revenue) Revenue_Sum, 'May' Month from Temp_Table_May where CustNo='1000' 

现在,这并不完全获得平均总和与3列,你正在寻找,但也许你可以用这种UNION查询创建一个VIEW,然后在该VIEW上使用GROUP BY查询来聚合数据。

+2

你想要UNION ALL而不是UNION。 UNION可能代价高昂,因为它可识别并消除所有重复项。 – Codo 2012-07-29 15:09:46

+0

Thanks @Codo我不知道这件事。 – DavidHyogo 2012-07-29 15:11:33

+0

嗨大卫,我需要结果在不同的列,但与上述查询我得到他们在同一列。可以做任何事情吗? – 2012-07-29 15:22:42

3

下可能的工作:

select Rev_June, Rev_Apr, Rev_May, 
    (Rev_June + Rev_Apr + Rev_May)/3 Avg_3_Mon 
from (
    (select sum(Revenue) from Temp_Table_Jun where CustNo='1000') as Rev_June, 
    (select sum(Revenue) from Temp_Table_Apr where CustNo='1000') as Rev_Apr, 
    (select sum(Revenue) from Temp_Table_May where CustNo='1000') as Rev_May 
    from dual 
)