我相信有一种方法可以做到这一点,但我不像其他人那样熟悉ORACLE 10g.这是场景:
我目前正在将经典ASP页面转换为ASP.net 2.0.我有一个创建报告的查询.它报告了销售额与之前的销售额.目前发生的事情是一个查询将进入数据库并获取销售我们产品的完整位置列表.然后,它遍历每个位置的行,并在SQL中运行一些求和操作.
它会转到其他几个表,总结销售数量,然后将总和添加到表行等.由于位置查询返回了大量结果,查询需要2-3分钟.
我的问题是如何将这些全部合并到一个查询中.
地点查询:
SELECT DISTINCT t.location, l.city, f.year, f.customer FROM loc t, location l, father_table f WHERE f.number = t.number(+) AND f.code = '0001' AND f.c_code = '01' AND t.location= l.code(+) AND t.code IN ('C', 'S') AND t.co_code IN ('G', 'V', 'A', 'D') AND t.year = '2008' ORDER BY l.city, f.year
上述查询中每个行的总和查询是:
SELECT SUM(nvl(t.sale_quantity,0)) sale_quantity FROM loc t, father_table f WHERE f.number = t.number(+) AND f.code = '0001' AND f.c_code = '01' AND f.year = '2008' AND t.code = 'C' AND t.location = '1566' <----- EACH ROW'S t.location VALUE AND t.co_code IN ('G', 'V', 'A', 'D') GROUP BY t.location, t.code, f.year
而不是循环遍历原始查询的每个记录,有没有一种方法可以组合查询并在Location的查询中包含SUM.这里的关键是,当t.code ='C'而不是'C'和'S'时,第二个查询只获得销售额SUM
我认为这样做你想要的.如果它不完全正确,我认为你需要知道的关键是CASE表达; 这是一种在SUM函数中进行过滤的方法.
SELECT t.location, l.city, f.year, f.customer, SUM( NVL( CASE WHEN t.code ='C' THEN t.sale_quantity ELSE 0 END, 0)) sale_quantity FROM loc t, location l, father_table f WHERE f.number = t.number(+) AND f.code = '0001' AND f.c_code = '01' AND t.location= l.code(+) AND t.code IN ('C', 'S') AND t.co_code IN ('G', 'V', 'A', 'D') AND t.year = '2008' GROUP BY t.location, l.city, f.year ORDER BY l.city, f.year