2016-02-05 50 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