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 不求高效 但求能跑

 

(友情支持請掃描這個)

微信掃描上方二維碼捐贈


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM