2012-11-14 52 views
3

我的表包含以下結構:MySQL的SELECT TMP行 - 開始和結束日期之間的日期

START_DATE | END_DATE | COST 
2012-11-01 | 2012-11-05 | 500.5 

我想執行返回以下結果的SELECT語句:

DATE  | COST 
2012-11-01 | 100.1 
2012-11-02 | 100.1 
2012-11-03 | 100.1 
2012-11-04 | 100.1 
2012-11-05 | 100.1 

我可以計算如何將總成本除以開始和結束日期之間的天數,但不知道如何爲DATE列創建這些「虛擬行」。

也許這是不可能的。很感謝任何形式的幫助!

回答

3

最好的辦法是創建一個Calendar表。

你的目的,你需要的是一列...

CREATE TABLE Calendar AS (calendar_date DATE) 

然後你填補表,你將永遠是感興趣的所有日期。即使它是一百年,該表將仍然很小。

請記住將該列添加爲主鍵。

然後你只需加入在桌子上......

SELECT 
    * 
FROM 
    yourTable 
INNER JOIN 
    calendar 
    ON calendar.calendar_date >= yourTable.start_date 
    AND calendar.calendar_date <= yourTable.end_date 

以後你會發現,你想知道的假期,財政年度邊界等,這些日期都可以添加另外的字段和索引到該日曆表。

這很像緩存,而不是重新計算查詢中基於日期的雜亂規則。

或者,您可以將其視爲維度表,其中數據是ID,其他列是事實。

+0

謝謝!奇蹟般有效。 – user1753401

2

我同意Dems有一個日曆表,這是最好的選擇。由於Mysql沒有像ROW_NUMBER那樣的函數,因爲許多其他的RDBMS都有。

另一個選項將創建一個序號表。您可以填寫此表有相當數量的值(比如1至100K),你認爲會有任何起始日期間的最大天數日期和結束日期

create table seq 

(rn int); 

insert into seq 
select 0 as rn union all 
select 1 as rn union all 
select 2 as rn union all 
select 3 as rn union all 
select 4 as rn union all 
select 5 as rn 

然後運行下面的查詢:

select DATE_ADD(START_DATE, INTERVAL rn day) , 
     COST/(select datediff(END_DATE,START_DATE)+1 from table1) 
from Table1 
cross join seq 
where rn<=(select datediff(END_DATE,START_DATE) from table1) 


SQL fiddle demo

0

我同意你Sebas這個在oracle中工作.. 把你的表名來代替表1

的,如果你沒有訪問all_objects然後

select (I +START_DATE-1) date1,cost/((END_DATE-START_DATE)+1) cost from table1 ,( select I from DUAL 
       model 
       dimension by (1 i) 
       measures (0 X) 
       (X[for I from 2 to 10000 increment 1] = 0)) 
       where END_DATE>=I +START_DATE-1; 

,如果你有機會獲得元表all_objects那麼試試這個

SELECT DATE1.DATE_ALL, table1.cost/((table1.END_DATE-table1.START_DATE)+1) NEW_COST 
FROM table1 INNER JOIN 
    (
    SELECT START_DATE + rownum-1 DATE_ALL 
    FROM ALL_OBJECTS 
      CROSS JOIN table1 
    WHERE 
     START_DATE + rownum - 1 <= (SELECT MAX(END_DATE) FROM table1) 
    ) DATE1 ON table1.END_DATE >= DATE1.DATE_ALL 

請讓我知道你是否有任何問題。

+0

_let我知道如果你有任何問題_是啊,我至少有一個:請不要發明像_u_ :-) – kleopatra

+0

歡迎來到StackOverflow。如果你想讓任何人認真對待你,請避免使用txtspk。 – marko

+0

我認爲這是針對Oracle的。模型子句在mysql中不存在。 – Sebas

相關問題