• 数据库查询结果其中一行减去另外两行的和,其余数据不变


    今天处理到一个比较棘手的问题。就是一张统计表中“工资及工资性费用”中要减去“部门奖金(2017年奖金)”,“奖金(其他)”这两个项目的和。

    由于不是相邻两行或者相邻两列之间做差,所以没有普遍性。

    思路就是:

    首先查询出排除“工资及工资性费用”的集合。(SELECT * FROM XXX WHERE FYXMC NOT LIKE '%工资及工资性费用%' )   T1

    然后,将标号为30和31的两行数据每个字段用SUM一次就和,分组字段就是除名称之外的所有字段。 其中REPLACE和TRIM的作用是去除左右两边的空格,包括全角的空格。

    SELECT 

    REPLACE(REPLACE(TRIM(BOTH FROM FYXMC),' '),' ') FYXMC,SUM(JSFY) JSFY,SUM(JCBJSFY) JCBJSFY,SUM(YXWHJSFY) YXWHJSFY,SUM(WHZJSFY) WHZJSFY,SUM(HYSYJSFY) HYSYJSFY,
    SUM(GZBJSFY) GZBJSFY,SUM(JSZCJSFY) JSZCJSFY,SUM(GSCMJSFY) GSCMJSFY,SUM(XMJSJSFY) XMJSJSFY,SUM(SWWZJSFY) SWWZJSFY,SUM(CPFHJSFY) CPFHJSFY,
    SUM(JGGLJSFY) JGGLJSFY,SUM(CWJSFY) CWJSFY,SUM(RLZYJSFY) RLZYJSFY,SUM(BGSJSFY) BGSJSFY

    FROM 

    .... .....

    GROUP BY REPLACE(REPLACE(TRIM(BOTH FROM FYXMC),' '),' '),T.JSFY,T.JCBJSFY,T.YXWHJSFY,T.WHZJSFY,T.HYSYJSFY,T.GZBJSFY,
    T.JSZCJSFY,T.GSCMJSFY,T.XMJSJSFY,T.SWWZJSFY,T.CPFHJSFY,T.JGGLJSFY,T.CWJSFY,T.RLZYJSFY,T.BGSJSFY。

    其次,以左外关联 LEFT JOIN的方式进行关联,T2每一个字段减去T4的每一个字段:

    (SELECT '工资及工资性费用(不包含奖金)' FYXMC ,
    T2.JSFY-T4.JSFY JSFY,T2.JCBJSFY-T4.JCBJSFY JCBJSFY,T2.YXWHJSFY-T4.YXWHJSFY YXWHJSFY,T2.WHZJSFY-T4.WHZJSFY WHZJSFY,T2.HYSYJSFY-T4.HYSYJSFY HYSYJSFY,
    T2.GZBJSFY-T4.GZBJSFY GZBJSFY,T2.JSZCJSFY-T4.JSZCJSFY JSZCJSFY,T2.GSCMJSFY-T4.GSCMJSFY GSCMJSFY,T2.XMJSJSFY-T4.XMJSJSFY XMJSJSFY,T2.SWWZJSFY-T4.SWWZJSFY SWWZJSFY,
    T2.CPFHJSFY-T4.CPFHJSFY CPFHJSFY,T2.JGGLJSFY-T4.JGGLJSFY JGGLJSFY,T2.CWJSFY-T4.CWJSFY CWJSFY,T2.RLZYJSFY-T4.RLZYJSFY RLZYJSFY,T2.BGSJSFY-T4.BGSJSFY BGSJSFY
    FROM

    T2

    LEFT JOIN T4 ON T4.FYXMC=T2.FYXMC )   T3

    最后,将处理过后的结果T1T3用UNION ALL合并成最终结果集。

     举一反三

    如果有其他的特殊需求,比如其中特定的一行减去另外一行的每一列的数据,也可以用这种思路进行操作。

  • 相关阅读:
    单向链表
    字符串的碎片整理。。。
    刷夜有感
    C中的枚举类型及一些用法
    hdu 1001(无赖的一种方法)
    加法器和布尔运算符
    《C和指针》学习笔记(4)
    Java中创建对象的5种方式 -[转] http://www.codeceo.com/article/5-ways-java-create-object.html
    程序员转行为什么这么难--[转]
    Tomcat 性能优化之APR插件安装 -- [转]
  • 原文地址:https://www.cnblogs.com/CryOnMyShoulder/p/8023454.html
Copyright © 2020-2023  润新知