无法获取一天的数据并显示从表中获取的所有数据

时间:2011-05-31 05:16:56

标签: sql oracle

我有一张包含多个地点和日期的销售数据的表格。 例如:

Date        Area      Total Sales Obj1    Obj2    Obj3    Obj4  

5/29/2011   Maharastra      4       1       0       3       0  
5/30/2011   Maharastra      1       0       0       0       1  
5/30/2011   Kolkota         5       0       5       0       3  
5/30/2011   Bihar           2       0       2       0       3  
5/30/2011   Mumbai          0       0       0       0       1  
5/30/2011   AndhraPradesh   3       0       3       0       2

我希望这个显示以及只有前几天数据的更多列,例如,对于Maharastra,它应该是一个列,如下所示:

Area     Total Sales Obj1 Obj2 Obj3 Obj4 PrvDyTtl PrvObj1 PrvObj2 PrvObj3 PrvObj4  

Maharastra         5    1    0    3    1        4       1       0       3       0  
Kolkota            5    0    5    0    3        0       0       0       0       0  
Bihar              2    0    2    0    3        0       0       0       0       0  
Mumbai             0    0    0    0    1        0       0       0       0       0  
AndhraPradesh      3    0    3    0    2        0       0       0       0       0  

我无法做到这一点,因为无论我尝试做什么,我都会为马哈拉施特拉邦的2个日期提供两行。 请帮忙。

3 个答案:

答案 0 :(得分:0)

    select * 
    from sales_data today 
       , sales_data ystd
    where today.area= ystd.area(+)
    and  trunc(today.date_column, 'DD') = trunc(SYSDATE, 'DD')
    and  trunc(ystd.date_column(+), 'DD') = trunc(SYSDATE-1,'DD')

修改

SELECT * 
FROM (
      SELECT 
              date_column
            , Area
            , Total
            , Sales
            , Obj1
            , LEAD( Total) over (partition by area order by date_column DESC)
            , LEAD( Sales) over (partition by area order by date_column DESC)
            , LEAD( Obj1 ) over (partition by area order by date_column DESC)
      FROM sales
      WHERE trunc(date_column,'DD') = trunc(SYSDATE-1, 'DD') 
         OR trunc(date_column, 'DD') = trunc(SYSDATE, 'DD') 
)
WHERE trunc(date_column, DD) = trunc(SYSDATE - 1, 'DD')

答案 1 :(得分:0)

**请注意我不完全确定此声明是否与oracle 100%兼容,但总体结构应该相同

SELECT tblToday.Date, tblToday.Area, tblToday.Total, tblToday.Sales, tblToday.Obj1, tblToday.Obj2, tblToday.Obj3, tblToday.Obj4,tblYesterday.Total AS PrevDayTotal, tblYesterday.Obj AS PrevObj1, tblYesterday.Obj2 as PrevObj2, tblYesterday.Obj3 AS PrevObj3,tblYesterday.Obj4 AS PrevObj4
FROM table tblToday LEFT OUTER JOIN 
     table tblYesterday ON DateADD(day,-1,tblToday.Date) = tblYesterday.Date AND tblToday.Area = tblYesterday.Area

在where子句中指定tblToday.Date,即tblToday.Date = GETDATE()

答案 2 :(得分:0)

我知道这不符合性能观点以及数据库架构中的标记。

但是它应该在你的提取中提供你想要的输出......

 select t1.Area, t1.Total_Sales as "Total sales", t2.*
from (select area, sum(total_sales) total_sales
      from sales_data
     group by area) t1,
   (select i_t_1.Obj1,
           i_t_1.Obj2,
           i_t_1.Obj3,
           i_t_1.Obj4,
           nvl(i_t_2.Total_Sales, 0) PrvDyTtl,
           nvl(i_t_2.obj1, 0) PrvObj1,
           nvl(i_t_2.Obj2, 0) PrvObj2,
           nvl(i_t_2.Obj3, 0) PrvObj3,
           nvl(i_t_2.Obj4, 0) PrvObj4
      from sales_data i_t_1, sales_data i_t_2
     where i_t_1.area = i_t_2.area(+)
       and trunc(i_t_1.date)= trunc(SYSDATE)
       and trunc(i_t_2.date(+)) = trunc(SYSDATE - 1)) t2
  where t2.area = t1.area;

我认为表名是sales_data之前检查这只是将sales_data中的表名替换为你想要的table_name。