--雇员数据
CREATE TABLE Employee(
ID int,              --雇员编号(主键)
Name nvarchar(10),   --雇员名称
Dept nvarchar(10))   --所属部门
INSERT Employee SELECT 1,N'张三',N'大客户部'
UNION  ALL      SELECT 2,N'李四',N'大客户部'
UNION  ALL      SELECT 3,N'王五',N'销售一部'
--费用表
CREATE TABLE Expenses(
EmployeeID int,        --雇员编号
Date Datetime,         --发生日期
Expenses nvarchar(10), --指标名称
[Money] decimal(10,2)) --发生金额
INSERT Expenses SELECT 1,'2004-01-01',N'销售',100
UNION  ALL      SELECT 1,'2004-01-02',N'销售',150
UNION  ALL      SELECT 1,'2004-12-01',N'销售',200
UNION  ALL      SELECT 1,'2005-01-10',N'销售', 80
UNION  ALL      SELECT 1,'2005-01-15',N'销售', 90
UNION  ALL      SELECT 1,'2005-01-21',N'成本',  8
UNION  ALL      SELECT 2,'2004-12-01',N'成本',  2
UNION  ALL      SELECT 2,'2005-01-10',N'销售', 10
UNION  ALL      SELECT 2,'2005-01-15',N'销售', 40
UNION  ALL      SELECT 2,'2005-01-21',N'成本',  8
UNION  ALL      SELECT 3,'2004-01-01',N'销售',200
UNION  ALL      SELECT 3,'2004-12-10',N'销售', 80
UNION  ALL      SELECT 3,'2005-01-15',N'销售', 90
UNION  ALL      SELECT 3,'2005-01-21',N'销售',  8
GO

--统计
DECLARE @Period char(6)
SET @Period='200501' --统计的年月

--统计处理
DECLARE @Last_Period char(6),@Previous_Period char(6)
SELECT @Last_Period=CONVERT(char(6),DATEADD(Year,-1,@Period+'01'),112),
    @Previous_Period=CONVERT(char(6),DATEADD(Month,-1,@Period+'01'),112)
SELECT Dept,Expenses,Name,
    C_Money,
    L_Money,
    L_UP=C_Money-L_Money,
    L_Prec=CASE
            WHEN L_Money=0 THEN '----'
            ELSE SUBSTRING('↓-↑',CAST(SIGN(C_Money-L_Money) as int)+2,1)
                +CAST(CAST(ABS(C_Money-L_Money)*100/P_Money as decimal(10,2)) as varchar)+'%'
        END,
    P_Money,
    P_UP=C_Money-P_Money,
    P_Prec=CASE
            WHEN P_Money=0 THEN '----'
            ELSE SUBSTRING('↓-↑',CAST(SIGN(C_Money-P_Money) as int)+2,1)
                +CAST(CAST(ABS(C_Money-P_Money)*100/P_Money as decimal(10,2)) as varchar)+'%'
        END
FROM(
    SELECT a.Dept,b.Expenses,
        Name=CASE WHEN GROUPING(Name)=1 THEN '<合计>' ELSE a.Name END,    
        C_Money=ISNULL(SUM(CASE CONVERT(char(6),b.Date,112) WHEN @Period THEN b.[Money] END),0),
        L_Money=ISNULL(SUM(CASE CONVERT(char(6),b.Date,112) WHEN @Last_Period THEN b.[Money] END),0),
        P_Money=ISNULL(SUM(CASE CONVERT(char(6),b.Date,112) WHEN @Previous_Period THEN b.[Money] END),0)
    FROM Employee a,Expenses b
    WHERE a.ID=b.EmployeeID
        AND CONVERT(char(6),b.Date,112) IN(@Last_Period,@Previous_Period,@Period)
    GROUP BY a.Dept,b.Expenses,a.ID,a.Name WITH ROLLUP
    HAVING (GROUPING(a.Name)=0 OR GROUPING(a.ID)=1)
        AND (GROUPING(a.ID)=0 OR GROUPING(b.Expenses)=0))a
/*--结果
Dept     Expenses    Name    C_Money L_Money L_UP   L_Prec    P_Money P_UP   P_Prec
------- --------- -------- --------- -------- -------- -------- -------- -------- ------
大客户部   成本   张三        8.00       .00      8.00      ----         .00         8.00         ----
大客户部   成本   李四        8.00       .00      8.00      ----         2.00        6.00         ↑300.00%
大客户部   成本   <合计>      16.00      .00      16.00     ----        2.00        14.00       ↑700.00%
大客户部   销售   张三         170.00      250.00  -80.00   ↓32.00%     200.00      -30.00      ↓15.00%
大客户部   销售   李四         50.00       .00      50.00     ----        .00         50.00        ----
大客户部   销售   <合计>       220.00      250.00  -30.00   ↓12.00%      200.00      20.00       ↑10.00%
销售一部   销售   王五         98.00       200.00  -102.00  ↓51.00%      80.00       18.00       ↑22.50%
销售一部   销售   <合计>       98.00       200.00  -102.00  ↓51.00%      80.00       18.00       ↑22.50%
--*/

转载于:https://www.cnblogs.com/shihao/archive/2012/05/19/2508639.html

同期及上期数据对比处理示例.sql相关推荐

  1. 同期及上期数据对比显示

    --雇员数据 CREATE TABLE Employee( ID int,              --雇员编号(主键) Name nvarchar(10),   --雇员名称 Dept nvarc ...

  2. oracle 两表两列数据对比_【SQL】根据两列信息,整合两张表数据

    两张表数据如下: --2017年 id college score A001 北京大学 670 A002 中国人民大学 646 A003 清华大学 664 A003 清华大学         (定向) ...

  3. oracle取同期和上期,取同期和上期数据

    SELECT  T.OrderDate,T.数量,s.数量,a.数量 from ( SELECT OrderDate,SUM(数量) AS 数量 FROM OrderTable )t left joi ...

  4. 两年数据对比柱形图_同期数据对比,你会做这样特殊的柱形图吗?趋势、差异值一目了然...

    2019年即将结束,各公司部门也开始进行年度数据回顾.比如2018和2019年各季度同期数据对比.一般情况下,做两组数据对比,许多同学都是用普通的柱形图来表示.用各季度作为横坐标,然后同期对比的季度进 ...

  5. web项目实践1-iwebshop项目-页面初始化数据与sql数据库中的数据对比

    当拿到项目后首先应该根据页面初始化数据与SQL数据库中的查询数据进行比对,进行初始化界面测试 初始化页面数据加载分析 1.查询首页的顶级分类 select * from iwebshop_catego ...

  6. Sql表结构及数据对比工具

    1 目的与意义 现管理技术小团队做zw项目.在上线时经常遇到sql未执行的漏洞,导致线上环境反复出现测试环境未出现过的bug. 为解决以上问题,对于由于sql导致的环境迁移的bug,需从配置数据.表结 ...

  7. 建议收藏 | 可实操,数据中台选型示例

    在了解清楚了选择数据中台时应关注的内容后,CTO/CIO可以借鉴以下数据中台选型示例,企业选购合适的数据中台. 01 项目背景 数字化时代,数据已经成为企业的战略级资产.某集团把建设数字化转型作为重要 ...

  8. 元数据与数据治理|Spark SQL结构化数据分析(第六篇)

    数据科学家们早已熟悉的R和Pandas等传统数据分析框架 虽然提供了直观易用的API,却局限于单机,无法覆盖分布式大数据场景.在Spark1.3.0以Spark SQL原有的SchemaRDD为蓝本, ...

  9. 爬虫找工作要掌握什么_数据分析师要掌握SQL到什么程度?

    是新朋友吗?记得先点蓝字关注我哦- 今日课程菜单 Java全栈开发 | Web前端+H5 大数据开发 | 数据分析  人工智能+Python | 人工智能+物联网 很多人入门学习数据分析,往往第一时间 ...

最新文章

  1. pip install -r requirement.txt 后 提示No such file or directory: ‘requirements.txt‘
  2. oracle秘钥到期,Oracle – 更新加入 – 非密钥保留表
  3. WordPress添加背景音乐
  4. Centos 6.2 单网卡安装pptpd 经验
  5. php中mysql数据库集群,MySQL集群
  6. JAVA 封装的简单运用
  7. d3 + geojson in node
  8. 第二季-专题8-不用内存怎么行
  9. macOS Monterey 12.0 Beta版 With Clover 5136 and OC 0.7.0 and PE 三EFI分区原版黑苹果镜像
  10. 12864液晶模块的详细使用
  11. 非华为电脑安装华为电脑管家11的方法,华为应用商店和华为浏览器电脑版
  12. 数据结构--最小生成树详解
  13. 【解决办法】adobe audition打不开 显示MSVCR71.dll丢失
  14. 信而泰 X-Snapper测试系统,助力家庭路由器IPv6支持度测试
  15. php 在服务器运行不起,PHP Cookies在localhost上运行良好,但在实时服务器上不起作用...
  16. BugKu CTF(杂项篇MISC)---哥哥的秘密
  17. EFF 测试 Privacy Badger,禁止第三方跟踪
  18. python读Excel数据成numpy数组
  19. 【大数据】9大实战项目解决你所有烦恼(写论文、找工作)
  20. Z-Libary最新地址检测,再也不用担心找不到ZLibary了

热门文章

  1. 8 种最坑的 SQL 错误用法,你有没有踩过坑?
  2. 面试题热个身:5 亿整数的大文件,来排个序?
  3. 快看过来,傻瓜都能理解的 Netty 模型架构
  4. Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析
  5. Docker inspect 命令
  6. 超键、候选键、主键、外键、联合主键、复合主键
  7. 常见拒绝服务型攻击原理及行为特征
  8. 2019中国大学生程序设计竞赛(CCPC)-网络选拔赛-第七题Shuffle Card
  9. java pdf添加图片_java实现在pdf模板的指定位置插入图片
  10. 学机械可以转计算机吗,本人合工大车辆工程大一新生,但是机械类前景都不太好,我要不要转计算机,求教?...