2016-02-05 46 views
1

我必須顯示2011-2014年的表中的數據。該表具有用於存儲實際年份的稱爲時間的另一個表的時間標識。 我有從這個日期id到日期id選擇數據的語句。oracle SQL從此date_id中選擇此date_id

SELECT sum(no_of_placements) 
    FROM fact_accounts 
WHERE 
    (SELECT account_dim.account_id FROM account_dim WHERE account_dim.account_name = 'DCompany1') 
    = fact_accounts.fk2 
    AND (
     (SELECT time_dim.time_id FROM time_dim WHERE time_dim.year = 2011) 
      = fact_accounts.fk1_time_id 
    OR (SELECT time_dim.time_id FROM time_dim WHERE time_dim.year = 2012) 
      = fact_accounts.fk1_time_id 
    OR (SELECT time_dim.time_id FROM time_dim WHERE time_dim.year = 2013) 
      = fact_accounts.fk1_time_id 
    OR (SELECT time_dim.time_id FROM time_dim WHERE time_dim.year = 2014) 
      = fact_accounts.fk1_time_id 
) 
GROUP BY fact_accounts.no_of_placements 

我該如何達到相同的目標,而無需設置每年匹配time_id的條件?這似乎不是有效的,因爲有更大範圍的年份。

回答

2
SELECT sum(no_of_placements) 
FROM fact_accounts, account_dim, time_dim 
WHERE account_dim.account_id = fact_accounts.fk2 
AND account_dim.account_name = 'DCompany1' 
AND fact_accounts.FK1_TIME_ID = time_dim.time_id 
AND time_dim.year BETWEEN 2011 AND 2014 

GROUP BY fact_accounts.no_of_placements 

SELECT sum(no_of_placements) 
    FROM fact_accounts, 
    WHERE 
    (select account_dim.account_id FROM account_dim WHERE account_dim.account_name = 'DCompany1') = fact_accounts.fk2 

AND fact_accounts.FK1_TIME_ID IN 
(select time_dim.time_id from time_dim WHERE 
time_dim.year BETWEEN 2011 AND 2014) 

GROUP BY fact_accounts.no_of_placements 

但是你爲什麼都通過總結和no_of_placements分組?這對我來說毫無意義。

+0

非常感謝!我第一次只做了group by,但它只從一行返回了no_of_placements,並沒有對它進行聚合。所以我使用了sum函數。 – DazedNConfused