日期:2014-05-17  浏览次数:21274 次

oracle 多表统计
本帖最后由 wenjun12369 于 2013-01-13 11:32:49 编辑
有一个复杂的sql语句  求大神指教。。。。
有苹果表,橘子表,香蕉表,表中有地区,时间字段,现在要求按照地区来统计数量。

合肥     5(苹果)  6(橘子) 7(香蕉)  18(小计)
安庆     6(苹果)  9(橘子) 3(香蕉)  18(小计)

能不能一次搜索出这个结果。。。多次统计最后数据处理比较麻烦。。。
后面的小计可以没有。。。有高手把竖排的统计也搞出来最好了。。。。
oracle 多表统计

------解决方案--------------------
使用区划表去Left join你的橘子表,苹果表
最后按照区划做group by 然后各个表的数量取sum就OK了
------解决方案--------------------
select AB.地区, 苹果, 橘子, 香蕉
from
(select A.地区, 苹果, 橘子
from 
(select 地区, count(*) 苹果
from 苹果表
group by 地区) A
full outer join
(select 地区, count(*) 橘子
from 橘子表
group by 地区) B
on A.地区 = B.地区) AB
full outer join
(select 地区, count(*) 香蕉
from 香蕉表
group by 地区) C
on AB.地区 = C.地区;

------解决方案--------------------
忘了小计字段:

select AB.地区, 苹果, 橘子, 香蕉, sum(苹果+橘子+香蕉) 小计
from
(select A.地区, 苹果, 橘子
from 
(select 地区, count(*) 苹果
from 苹果表
group by 地区) A
full outer join
(select 地区, count(*) 橘子
from 橘子表
group by 地区) B
on A.地区 = B.地区) AB
full outer join
(select 地区, count(*) 香蕉
from 香蕉表
group by 地区) C
on AB.地区 = C.地区;

------解决方案--------------------
with app as (
select 'A01' AS str,'12' as str2 FROM DUAL
UNION ALL
select 'A02' AS str,'22' as str2 FROM DUAL
UNION ALL
select 'A03' AS str,'32' as str2 FROM DUAL
),
orj as (
select 'A01' AS str,'14' as str2 FROM DUAL
UNION ALL
select 'A02' AS str,'24' as str2 FROM DUAL
UNION ALL
select 'A04' AS str,'34' as str2 FROM DUAL
),
ban as (
select 'A01' AS str,'16' as str2 FROM DUAL
UNION ALL
select 'A02' AS str,'26' as str2 FROM DUAL
UNION ALL
select 'A05' AS str,'36' as str2 FROM DUAL
),
area as (
select 'A01' AS str  FROM DUAL
UNION ALL
select 'A02' AS str  FROM DUAL
UNION ALL
select 'A03' AS str  FROM DUAL
UNION ALL
select 'A04' AS str  FROM DUAL
UNION ALL
select 'A05' AS str  FROM DUAL
)
SELECT nvl(area.str, 'Total') as str, 
sum(nvl(app.str2, 0)) as appstr2, 
sum(nvl(orj.str2, 0)) as orjstr2, 
sum(nvl(ban.str2, 0)) as banstr2, 
sum(nvl(app.str2, 0) + nvl(orj.str2, 0) + nvl(ban.str2, 0)) as subtotal