zoukankan      html  css  js  c++  java
  • 数据库查询结果其中一行减去另外两行的和,其余数据不变

    今天处理到一个比较棘手的问题。就是一张统计表中“工资及工资性费用”中要减去“部门奖金(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合并成最终结果集。

     举一反三

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

  • 相关阅读:
    从程序员到主编顺利转型
    DAS、NAS、SAN区别
    网线知识全接触
    浅议DAS、NAS、SAN区别
    写辞职信要注意的五个要点
    劳动合同签订中的法律问题
    辞职了,离职手续怎么办?
    系统集成工程师知识储备
    还是关于 标记当前
    一个JSON 实例 jQuery 解析JSON数据
  • 原文地址:https://www.cnblogs.com/CryOnMyShoulder/p/8023454.html
Copyright © 2011-2022 走看看