2014-12-03 20 views
1

我正在做的每日報告,這將產生一個價值未來7天爲這樣:SQL別名可以是一個函數嗎? (PL/SQL)

select 
a.itemnumber 
,sum(case when a.activitydate = trunc(sysdate) then a.qtyordered else 0 end) as Today 
,sum(case when a.activitydate = trunc(sysdate) + 1 then a.qtyordered else 0 end) as Tomorrow 
,sum(case when a.activitydate = trunc(sysdate) + 2 then a.qtyordered else 0 end) as Day3 
,sum(case when a.activitydate = trunc(sysdate) + 3 then a.qtyordered else 0 end) as Day4 
,sum(case when a.activitydate = trunc(sysdate) + 4 then a.qtyordered else 0 end) as Day5 
,sum(case when a.activitydate = trunc(sysdate) + 5 then a.qtyordered else 0 end) as Day6 
,sum(case when a.activitydate = trunc(sysdate) + 6 then a.qtyordered else 0 end) as Day7 
,a.balanceonhand BOH 

from 
mytable a 

where 
a.itemnumber between 14000 and 15000 

這些別名更模糊比我想的,特別是如果用戶比較從一天到另一天的報道,這些沒有任何意義。使用PL/SQL Developer,我可以創建一個會產生變量日期的別名嗎?我試了下面的代碼:

select 
a.itemnumber 
,sum(case when a.activitydate = trunc(sysdate) then a.qtyordered else 0 end) as sysdate 
,sum(case when a.activitydate = trunc(sysdate) + 1 then a.qtyordered else 0 end) as sysdate + 1 
,sum(case when a.activitydate = trunc(sysdate) + 2 then a.qtyordered else 0 end) as sysdate + 2 
,sum(case when a.activitydate = trunc(sysdate) + 3 then a.qtyordered else 0 end) as sysdate + 3 
,sum(case when a.activitydate = trunc(sysdate) + 4 then a.qtyordered else 0 end) as sysdate + 4 
,sum(case when a.activitydate = trunc(sysdate) + 5 then a.qtyordered else 0 end) as sysdate + 5 
,sum(case when a.activitydate = trunc(sysdate) + 6 then a.qtyordered else 0 end) as sysdate + 6 
,a.balanceonhand BOH 

from 
mytable a 

where 
a.itemnumber between 14000 and 15000 

group by 
a.itemnumber 
,a.balanceonhand 

但它說FROM關鍵字找不到預期的地方。這可能嗎?

+3

我不相信這是可能的。你必須使用動態SQL。 – ilitirit 2014-12-03 20:13:50

回答

1

如果您使用行生成器來獲取您的七個日期(或實際上任意數量的日期),會更容易。這將以行爲格式提供數據。

從那裏我建議PIVOT是將輸出重新格式化爲列而不是行的好方法。我在dategen查詢中提供了一個'offset'列,以便將它添加到startdate中,在這種情況下,它是一個sqlplus變量,但我建議在生產查詢中使用綁定變量。我強烈建議不要使用SYSDATE,因爲這會使測試變得非常困難。當您可以更改報告所涵蓋的日期以適應可用的測試數據時,這會更容易。

1 WITH 
    2 dategen 
    3 as 
    4 (
    5 SELECT TO_DATE('&startdate','DD-MON-YYYY')+LEVEL mydate, LEVEL myoffset 
    6 FROM dual 
    7 CONNECT BY LEVEL <=7) 
    8 SELECT itemnumber,balanceonhand, activitydate, today, tomorrow, day3, day4, day5, day6, day7 
    9 FROM (
10 SELECT * 
11 FROM mytable t 
12 JOIN dategen d ON (d.mydate = t.activitydate) 
13 PIVOT (
14 SUM(qtyordered) 
15 FOR myoffset IN (0 as today,1 as tomorrow,2 day3,3 as day4, 4 as day5, 5 as day6, 6 as day7) 
16*)) 
SQL>/
Enter value for startdate: 01-JAN-2015 
old 5: SELECT TO_DATE('&startdate','DD-MON-YYYY')+(level-1) mydate, LEVEL myoffset 
new 5: SELECT TO_DATE('01-JAN-2015','DD-MON-YYYY')+(level-1) mydate, LEVEL myoffset 

ITEMNUMBER BALANCEONHAND ACTIVITYDATE TODAY TOMORROW DAY3 DAY4 DAY5 DAY6 DAY7選擇


120  100 02-JAN-15     10 
    140  100 04-JAN-15       10 
    100  100 02-JAN-15     10 

3行。

SQL> select * from mytable; 

ITEMNUMBER BALANCEONHAND ACTIVITYDATE  QTYORDERED 
---------- ------------- ------------------ ---------- 
     100  100 02-JAN-15   10 
     120  100 02-JAN-15   10 
     140  100 04-JAN-15   10 

3 rows selected. 
相關問題