【SQL】学习记录【oracle统计】

【SQL】记录一下今天遇到的问题和解决方法

需求:有若干个类似的表,用于存放工作标准/工作指导书信息,数据字段包括这条指导书的发布状态、提交人、审核评分等,其中只有审核通过后状态为已发布的指导书才有评分。
现在要求做一个统计报表,查询出不同部门在某个时间段内 提交指导书的总数、审批通过数、通过率、评分总分,前端页面每个字段可做排序。最终效果如下:
在这里插入图片描述
问题一:查询的结果需要通过多张表联合累加,比如提交总数 = 若干张表每张表提交数相加。
解决办法
1、先查询单表的数量

SELECT count(1) c1, SUM(A.CONTRIBUTION) point, B.ORG_ID FROM LIB_WORK_STANDARD A, TOP_USER B  WHERE A.CREATE_USER = B.USER_ID GROUP BY B.ORG_ID

2、在select中做加法,其中要注意判断非空

SELECT ... NVL(c1.c1,0)+NVL(c4.c4,0)+NVL(c7.c7,0)+NVL(c10.c10,0) as sc FROM ...

问题二:计算采纳率的时候,提示除数为零。
解决办法
使用decode方法 select decode(b,0,0,a/b*100) rate from A;

decode的含义
含义解释:
decode(条件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)
该函数的含义如下:
IF 条件=值1 THEN
    RETURN(翻译值1)
ELSIF 条件=值2 THEN
    RETURN(翻译值2)
    …
ELSIF 条件=值n THEN
    RETURN(翻译值n)
ELSE
    RETURN(缺省值)
END IF
decode(字段或字段的运算,值1,值2,值3)
这个函数运行的结果是,当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3
当然值1,值2,值3也可以是表达式,这个函数使得某些sql语句简单了许多

问题三:对每个字段分别排序。
解决办法
1、查询条件order by字段由前端传入

 <choose>
 	<when test="sortFieldName !='' and sortFieldName !=null and sortType !='' and sortType !=null">
		ORDER BY ${sortFieldName} ${sortType}
	</when>
	<otherwise>ORDER BY POINT DESC</otherwise>
</choose>

整体的SQL列表代码如下:

<select id="queryList"
            parameterType="com.comtop.koron.library.standard.dto.LibStatisticsDto"
            resultType="java.util.Map">
        SELECT * FROM (
        SELECT t.*, ROWNUM RN FROM(
        SELECT org.ORG_NAME,
        NVL(c1.c1,0)+NVL(c4.c4,0)+NVL(c7.c7,0)+NVL(c10.c10,0) as sc,
        NVL(c2.c2,0)+NVL(c5.c5,0)+NVL(c8.c8,0)+NVL(c11.c11,0) as ac,
        NVL(c3.c3,0)+NVL(c6.c6,0)+NVL(c9.c9,0)+NVL(c12.c12,0) as rc,
        ROUND(decode((NVL(c1.c1,0)+NVL(c4.c4,0)+NVL(c7.c7,0)+NVL(c10.c10,0)),0,0,
        100*((NVL(c2.c2,0)+NVL(c5.c5,0)+NVL(c8.c8,0)+NVL(c11.c11,0))/(NVL(c1.c1,0)+NVL(c4.c4,0)+NVL(c7.c7,0)+NVL(c10.c10,0)))),2) as rate,
        (NVL(c2.point, 0)+NVL(c5.point, 0)+NVL(c8.point, 0)+NVL(c11.point, 0)) as point
        FROM TOP_ORGANIZATION org
        LEFT JOIN
                (SELECT count(1) c1, SUM(A.CONTRIBUTION) point, B.ORG_ID FROM LIB_WORK_STANDARD A, TOP_USER B
                WHERE A.CREATE_USER = B.USER_ID GROUP BY B.ORG_ID
                ) c1 ON org.ORG_ID = c1.ORG_ID
        <if test="queryBeginDate != null and queryBeginDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ >= ]]> #{queryBeginDate}
        </if>
        <if test="queryEndDate != null and queryEndDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ <= ]]> #{queryEndDate}
        </if>
        LEFT JOIN
                (SELECT count(1) c2, SUM(A.CONTRIBUTION) point, B.ORG_ID FROM LIB_WORK_STANDARD A, TOP_USER B
                WHERE A.STATUS = 'PUBLISHED' AND A.ACCEPT_STATUS = 1 AND A.CREATE_USER = B.USER_ID GROUP BY B.ORG_ID
                ) c2 ON org.ORG_ID = c2.ORG_ID
        <if test="queryBeginDate != null and queryBeginDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ >= ]]> #{queryBeginDate}
        </if>
        <if test="queryEndDate != null and queryEndDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ <= ]]> #{queryEndDate}
        </if>
        LEFT JOIN
                (SELECT count(1) c3, SUM(A.CONTRIBUTION) point, B.ORG_ID FROM LIB_WORK_STANDARD A, TOP_USER B
                WHERE A.CREATE_USER = B.USER_ID AND (A.ACCEPT_STATUS IS NULL OR A.ACCEPT_STATUS = 0) GROUP BY B.ORG_ID
                ) c3 ON org.ORG_ID = c3.ORG_ID
        <if test="queryBeginDate != null and queryBeginDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ >= ]]> #{queryBeginDate}
        </if>
        <if test="queryEndDate != null and queryEndDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ <= ]]> #{queryEndDate}
        </if>
        LEFT JOIN
                (SELECT count(1) c4, SUM(A.CONTRIBUTION) point, B.ORG_ID FROM LIB_COMMON_WORK_STANDARD A, TOP_USER B
                WHERE A.CREATE_USER = B.USER_ID GROUP BY B.ORG_ID
                ) c4 ON org.ORG_ID = c4.ORG_ID
        <if test="queryBeginDate != null and queryBeginDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ >= ]]> #{queryBeginDate}
        </if>
        <if test="queryEndDate != null and queryEndDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ <= ]]> #{queryEndDate}
        </if>
                        LEFT JOIN
                (SELECT count(1) c5, SUM(A.CONTRIBUTION) point, B.ORG_ID FROM LIB_COMMON_WORK_STANDARD A, TOP_USER B
                WHERE A.STATUS = 'PUBLISHED' AND A.ACCEPT_STATUS = 1 AND A.CREATE_USER = B.USER_ID GROUP BY B.ORG_ID
                ) c5 ON org.ORG_ID = c5.ORG_ID
        <if test="queryBeginDate != null and queryBeginDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ >= ]]> #{queryBeginDate}
        </if>
        <if test="queryEndDate != null and queryEndDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ <= ]]> #{queryEndDate}
        </if>
        LEFT JOIN
                (SELECT count(1) c6, SUM(A.CONTRIBUTION) point, B.ORG_ID FROM LIB_COMMON_WORK_STANDARD A, TOP_USER B
                WHERE A.CREATE_USER = B.USER_ID AND (A.ACCEPT_STATUS IS NULL OR A.ACCEPT_STATUS = 0) GROUP BY B.ORG_ID
                ) c6 ON org.ORG_ID = c6.ORG_ID
        <if test="queryBeginDate != null and queryBeginDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ >= ]]> #{queryBeginDate}
        </if>
        <if test="queryEndDate != null and queryEndDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ <= ]]> #{queryEndDate}
        </if>
        LEFT JOIN
                (SELECT count(1) c7, SUM(A.CONTRIBUTION) point, B.ORG_ID FROM LIB_PAT_STANDARD A, TOP_USER B
                WHERE A.CREATE_UID = B.USER_ID GROUP BY B.ORG_ID
                ) c7 ON org.ORG_ID = c7.ORG_ID
        <if test="queryBeginDate != null and queryBeginDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ >= ]]> #{queryBeginDate}
        </if>
        <if test="queryEndDate != null and queryEndDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ <= ]]> #{queryEndDate}
        </if>
        LEFT JOIN
                (SELECT count(1) c8, SUM(A.CONTRIBUTION) point, B.ORG_ID FROM LIB_PAT_STANDARD A, TOP_USER B
                WHERE A.STATUS = 'PUBLISHED' AND A.ACCEPT_STATUS = 1 AND A.CREATE_UID = B.USER_ID GROUP BY B.ORG_ID
                ) c8 ON org.ORG_ID = c8.ORG_ID
        <if test="queryBeginDate != null and queryBeginDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ >= ]]> #{queryBeginDate}
        </if>
        <if test="queryEndDate != null and queryEndDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ <= ]]> #{queryEndDate}
        </if>
        LEFT JOIN
                (SELECT count(1) c9, SUM(A.CONTRIBUTION) point, B.ORG_ID FROM LIB_PAT_STANDARD A, TOP_USER B
                WHERE A.CREATE_UID = B.USER_ID  AND (A.ACCEPT_STATUS IS NULL OR A.ACCEPT_STATUS = 0) GROUP BY B.ORG_ID
                ) c9 ON org.ORG_ID = c9.ORG_ID
        <if test="queryBeginDate != null and queryBeginDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ >= ]]> #{queryBeginDate}
        </if>
        <if test="queryEndDate != null and queryEndDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ <= ]]> #{queryEndDate}
        </if>
        LEFT JOIN
                (SELECT count(1) c10, SUM(A.CONTRIBUTION) point, B.ORG_ID FROM LIB_COMMON_PAT_STANDARD A, TOP_USER B
                WHERE A.CREATE_UID = B.USER_ID GROUP BY B.ORG_ID
                ) c10 ON org.ORG_ID = c10.ORG_ID
        <if test="queryBeginDate != null and queryBeginDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ >= ]]> #{queryBeginDate}
        </if>
        <if test="queryEndDate != null and queryEndDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ <= ]]> #{queryEndDate}
        </if>
        LEFT JOIN
                (SELECT count(1) c11, SUM(A.CONTRIBUTION) point, B.ORG_ID FROM LIB_COMMON_PAT_STANDARD A, TOP_USER B
                WHERE A.STATUS = 'PUBLISHED' AND A.ACCEPT_STATUS = 1 AND A.CREATE_UID = B.USER_ID GROUP BY B.ORG_ID
                ) c11 ON org.ORG_ID = c11.ORG_ID
        <if test="queryBeginDate != null and queryBeginDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ >= ]]> #{queryBeginDate}
        </if>
        <if test="queryEndDate != null and queryEndDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ <= ]]> #{queryEndDate}
        </if>
        LEFT JOIN
                (SELECT count(1) c12, SUM(A.CONTRIBUTION) point, B.ORG_ID FROM LIB_COMMON_PAT_STANDARD A, TOP_USER B
                WHERE A.CREATE_UID = B.USER_ID AND (A.ACCEPT_STATUS IS NULL OR A.ACCEPT_STATUS = 0) GROUP BY B.ORG_ID
                ) c12 ON org.ORG_ID = c12.ORG_ID
        <if test="queryBeginDate != null and queryBeginDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ >= ]]> #{queryBeginDate}
        </if>
        <if test="queryEndDate != null and queryEndDate !=''">
            AND A.SUBMIT_TIME <![CDATA[ <= ]]> #{queryEndDate}
        </if>
        <where>
            <if test="orgIdList != null and orgIdList != '' ">
                AND org.ORG_ID IN
                <foreach item="item" collection="orgIdList" open="(" separator="," close=")">
                    #{item}
                </foreach>
            </if>
        </where>
        <choose>
            <when test="sortFieldName !='' and sortFieldName !=null
				and sortType !='' and sortType !=null">
                ORDER BY ${sortFieldName} ${sortType}
            </when>
            <otherwise>ORDER BY POINT DESC</otherwise>
        </choose>
        ) t
        WHERE ROWNUM <![CDATA[ <= ]]> (#{pageSize} * #{pageNo})
        )
        WHERE RN <![CDATA[ > ]]> (#{pageSize} * (#{pageNo}-1))
    </select>
发布了14 篇原创文章 · 获赞 1 · 访问量 270

猜你喜欢

转载自blog.csdn.net/qq_39938236/article/details/103126878
今日推荐