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语句。。貌似实现不了,求大神赐教
需求是:保证所有的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一定出现了。
太感谢您了。。。根据您的思路,已经完美解决这个问题。下面是我写的代码
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;
再次说声谢谢!