首页 新闻 搜索 专区 学院

关于一个sql查询的问题

0
悬赏园豆:50 [已解决问题] 解决于 2016-06-16 09:27

1.protect_entity_materials 表结构

ID NUMBER(30) --主键ID
GRID_ID NUMBER(30) Y --行政区划ID
MATERIAL_MUMBER NUMBER(19,4) Y --物资数量
STORE_TYPE VARCHAR2(4 CHAR) Y --存储方式

2.grid表(树形结构)

ID NUMBER(30) --主键ID

TOPGRID_ID NUMBER(30) --上级行政区域ID

NAME VARCHAR2(4 CHAR) Y --区域名称

3.目前要解决的:按存储方式统计某一地区的物资数量

4.现在已经写好的sql语句:

 

SELECT
p.STORE_TYPE,
sum(nvl(p.material_mumber,0)) AS total
FROM protect_entity_materials p
WHERE p.grid_id IN (SELECT g.id
       FROM grid g
START WITH g.ID = 1715 CONNECT BY PRIOR g.id = g.topgrid_id)
GROUP BY p.STORE_TYPE;

结果:


5.现在面临的问题:
这个存储方式一共三种:协议储备、产能储备、实物储备,grid_id = 1715 是统计深圳市下面的不同存储方式的物资,假如我统计gird_id = 891,也就是罗湖区下面的物资的时候,结果如下


我现在就是想罗湖区的产能储备方式的物资是没有数量的,我也想让他显示对应的名称和统计数量(结果为0),类似于下面:


请问这个问题该如何才能解决呢?我自己写的sql语句。。貌似实现不了,求大神赐教
狂奔的小李子的主页 狂奔的小李子 | 初学一级 | 园豆:4
提问于:2016-06-15 11:12
< >
分享
最佳答案
0

需求是:保证所有的Store_Type都出现。

Select distinct store_type from tableA,或者你有一个表保存Store_Type都可以。

Select Store_Type, isnull(Total,0) from TableA left outer join (这儿是你的统计语句)TableB 

on TableA.Store_Type=TableB.Store_Type

这样就可以保证Store_Type一定出现了。

收获园豆:50
爱编程的大叔 | 高人七级 |园豆:30753 | 2016-06-15 11:21

太感谢您了。。。根据您的思路,已经完美解决这个问题。下面是我写的代码

SELECT t1.STORE_TYPE,nvl(t2.total,0) AS total
FROM (
SELECT STORE_TYPE
FROM PROTECT_ENTITY_MATERIALS
GROUP BY STORE_TYPE
) t1 LEFT OUTER JOIN
(
SELECT
p.STORE_TYPE,
nvl(sum(p.material_mumber),0) AS total
FROM protect_entity_materials p
WHERE p.grid_id IN (SELECT g.id
FROM grid g
START WITH g.ID = 891 CONNECT BY PRIOR g.id = g.topgrid_id)
GROUP BY p.STORE_TYPE
) t2
on t1.STORE_TYPE = t2.STORE_TYPE;

再次说声谢谢!

狂奔的小李子 | 园豆:4 (初学一级) | 2016-06-15 11:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册