• SQL Server 2008 R2——当前日期下,一年前数据的统计值


    =================================版权声明=================================

    版权声明:原创文章 谢绝转载 

    请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我

    勿用于学术性引用。

    勿用于商业出版、商业印刷、商业引用以及其他商业用途。                   

    本文不定期修正完善。

    本文链接:http://www.cnblogs.com/wlsandwho/p/5010250.html

    耻辱墙:http://www.cnblogs.com/wlsandwho/p/4206472.html

    =======================================================================

    没啥说的,鄙视那些无视版权随意抓取博文的爬虫小网站,祝你们早升极乐。

    =======================================================================

    这是企鹅群里一群友的问题。早晨9:13入群问问题,然后可以等一天,真佩服。

    当然本着拒绝伸手党的原则,我给的代码只是大致的一个解决方案,并不使用给出的字段、数据以及边界范围。

    =======================================================================

    完整代码如下

     1 --by wls 20151201
     2 --网络代码有风险
     3 --复制粘贴须谨慎
     4 USE tempdb
     5 GO
     6 
     7 IF OBJECT_ID (N't_TestbyWLS', N'U') IS NOT NULL
     8 DROP TABLE t_TestbyWLS;
     9 GO
    10 
    11 CREATE TABLE t_TestbyWLS(SN INTEGER PRIMARY KEY,OccurTime DATETIME,OccurQty INTEGER)
    12 GO
    13 
    14 INSERT INTO  t_TestbyWLS 
    15 SELECT 1,'2015-12-01 11:11:11.111',11
    16 UNION
    17 SELECT 111,'2015-12-01 10:11:11.111',22
    18 UNION
    19 SELECT 2,'2015-11-11 11:11:11.111',33
    20 UNION
    21 SELECT 3,'2015-11-01 11:11:11.111',44
    22 UNION
    23 SELECT 4,'2015-09-11 11:11:11.111',55
    24 UNION
    25 SELECT 6,'2015-09-11 11:11:11.111',66
    26 UNION
    27 SELECT 7,'2015-08-11 11:11:11.111',111
    28 UNION
    29 SELECT 8,'2015-08-01 11:11:11.111',11
    30 UNION
    31 SELECT 9,'2015-07-11 11:11:11.111',11
    32 UNION
    33 SELECT 10,'2015-07-11 11:11:10.111',111
    34 UNION
    35 SELECT 11,'2015-06-11 11:11:11.111',11
    36 UNION
    37 SELECT 12,'2015-06-11 11:11:11.111',111
    38 UNION
    39 SELECT 13,'2015-05-11 11:11:11.111',11
    40 UNION
    41 SELECT 14,'2015-05-11 11:11:11.111',111
    42 UNION
    43 SELECT 15,'2015-04-11 11:11:11.111',11
    44 UNION
    45 SELECT 16,'2015-04-11 11:11:11.111',111
    46 UNION
    47 SELECT 17,'2015-03-11 11:11:11.111',11
    48 UNION
    49 SELECT 18,'2015-03-11 11:11:11.111',111
    50 UNION
    51 SELECT 19,'2015-02-11 11:11:11.111',11
    52 UNION
    53 SELECT 20,'2015-02-01 11:11:11.111',10
    54 UNION
    55 SELECT 21,'2015-01-11 11:11:11.111',11
    56 UNION
    57 SELECT 22,'2015-01-01 11:11:11.111',10
    58 UNION
    59 SELECT 23,'2014-11-11 11:11:11.111',11
    60 UNION
    61 SELECT 24,'2013-11-11 11:11:11.111',11
    62 UNION
    63 SELECT 25,'2014-12-11 11:11:11.111',11
    64 GO
    65 
    66 --SELECT * FROM t_TestbyWLS
    67 --GO
    68 
    69 WITH TempYYYYMM
    70 AS
    71 (
    72 SELECT SN,OccurQty,OccurTime,CAST(CONVERT (NVARCHAR(12),occurtime,112) AS INTEGER)/100 AS YYYYMM FROM t_TestbyWLS
    73 ),
    74 TempSumMM
    75 AS 
    76 (
    77 SELECT YYYYMM,SUM(OccurQty) AS MMqty FROM  TempYYYYMM   GROUP BY YYYYMM
    78 ),
    79 TempRangeYYYYMM
    80 as
    81 (
    82 SELECT CAST(CONVERT (NVARCHAR(12),DATEADD(YEAR,-1,GETDATE()),112) AS INTEGER)/100 AS LYYYYMM,
    83        CAST(CONVERT (NVARCHAR(12),GETDATE(),112) AS INTEGER)/100 AS RYYYYMM
    84 )
    85 SELECT DISTINCT b.MMqty,b.yyyymm from TempSumMM b LEFT JOIN TempYYYYMM  a ON b.YYYYMM=a.YYYYMM LEFT  JOIN  TempRangeYYYYMM c 
    86 ON  b.YYYYMM>=c.LYYYYMM AND b.YYYYMM<c.RYYYYMM ORDER BY b.YYYYMM
    87 GO

    =======================================================================

    CTE分了三个部分:

    第一部分增加YYYYMM,因为直接用DATETIME类型进行操作感觉不方便。

    投机取巧的地方是把DATETIME转作整数类型的“年+月”处理,“年+月”是YYYYMM的样式,不包含DD。年月的大小跟数字的大小自然契合,方便比较。

    第二部分按YYYYMM分组进行了数据统计。

    第三部分只是我不想写成存储过程,就顺便写了个选择语句,用途是生成“当前日期的一年前”这个概念涉及到的边界值。很显然可以方便的对边界进行包含和不包含的处理。

    =======================================================================

    下面是执行计划,看起来还不错,当然我的数据很少。

    =======================================================================

    非专业SQL 不求高效 但求能跑

    (友情支持请扫描这个)

    微信扫描上方二维码捐赠

  • 相关阅读:
    Cisco 路由器硬件信息(各种序列号)查询命令
    解析黑客利用交换机漏洞攻击的常用手段
    所有windows操作系统键盘操作
    [转载]UC黑话解释Cisco统一通信江湖黑话解释
    常用照片尺寸和纸张尺寸参考
    Word中如何選擇從向文字
    python基础数据类型元组(tuple)
    promiseAll 使用
    js JavaScript 封装异步函数并被调用
    promise 学习2
  • 原文地址:https://www.cnblogs.com/wlsandwho/p/5010250.html
Copyright © 2020-2023  润新知