现在的位置: 首页 > 综合 > 正文

SQL进阶提升(试题)-学习sql server2005 step by step(九)

2011年06月09日 ⁄ 综合 ⁄ 共 5527字 ⁄ 字号 评论关闭

问题一

--问题描述

--第一是.关于加班时 ?的问 ?

--  公司规 ©w一周内 ³Ì多只能加班和个而 ¤é期¥|A001  5

--周五A001  7

------------------

--  共计 ¥[班:H,超出H

--

--从¨Ì次Ñ减的H),一轮 ¦Z如果还 ¤£够 ¡A再继 ?下一轮 ¡A直到刚 ¦n为为止(只对 ¶W过的而言)

--

--最后的结 ªG应 ?是:

--日期工号 加班小时

--周一A001  3  --减了次

--周二A001  1  --减了次

--周三A001  1  --减了次

--周四A001  2  --减了次

--周五A001  5  --减了次

-------------------------

--以上只列具体某一个 ¤H的,公司有好几千人,

--用SQL语句实 ?,考虑 ¨ì效率问 ?规 ©w:

--1.不能用游标

--2.不能用循环

--其它方法都可以

 

代码

1 DECLARE @T TABLE (日期VARCHAR(4),工号 VARCHAR(4),加班小时 INT)
2
3  INSERT INTO @T
4
5  SELECT '周一','A001',6 UNION ALL
6
7  SELECT '周二','A001',2 UNION ALL
8
9  SELECT '周三','A001',1 UNION ALL
10
11  SELECT '周四','A001',5 UNION ALL
12
13  SELECT '周五','A001',7
14
15
16
17  --SQL查询 ¦p下:
18
19
20
21 ;WITH LiangLoveLan AS
22
23 (
24
25 SELECT *
26
27 FROM (
28
29 SELECT 日期,工号 ,加班小时 FROM @T
30
31 UNION ALL
32
33 SELECT '总 ?',工号 ,SUM(加班小时 ) FROM @T GROUP BY 工号 ) AS T
34
35 PIVOT(MAX(加班小时 ) FOR 日期IN([周一],[周二],[周三],[周四],[周五],[总数])) AS pvt
36
37 ),
38
39 LiangLoveLan2 AS
40
41 (
42
43 SELECT *,number = 1
44
45 FROM LiangLoveLan
46
47 UNION ALL
48
49 SELECT
50
51 工号 ,
52
53 周一=CASE WHEN 周一>1 AND number = 1
54
55 THEN 周一-1
56
57 ELSE 周一END,
58
59 周二=CASE WHEN 周二>1 AND number = 2
60
61 THEN 周二-1
62
63 ELSE 周二END,
64
65 周三=CASE WHEN 周三>1 AND number = 3
66
67 THEN 周三-1
68
69 ELSE 周三END,
70
71 周四=CASE WHEN 周四>1 AND number = 4
72
73 THEN 周四-1
74
75 ELSE 周四END,
76
77 周五=CASE WHEN 周五>1 AND number = 5
78
79 THEN 周五-1
80
81 ELSE 周五END,
82
83 总数=CASE WHEN number=1 AND 周一>1 THEN 总 ?-1
84
85 WHEN number=2 AND 周二>1 THEN 总 ?-1
86
87 WHEN number=3 AND 周三>1 THEN 总 ?-1
88
89 WHEN number=4 AND 周四>1 THEN 总 ?-1
90
91 WHEN number=5 AND 周五>1 THEN 总 ?-1
92
93 ELSE 总 ?
94
95 END,
96
97 number=CASE WHEN number=1 THEN 2
98
99 WHEN number=2 THEN 3
100
101 WHEN number=3 THEN 4
102
103 WHEN number=4 THEN 5
104
105 WHEN number=5 THEN 1
106
107 END
108
109 FROM LiangLoveLan2
110
111 WHERE 总 ?>12
112
113 )
114
115 SELECT
116
117 CAST(日期AS VARCHAR(20)) AS 日期,
118
119 工号 ,
120
121 加班小时 FROM (
122
123 SELECT 工号 ,周一,周二,周三,周四,周五
124
125 FROM LiangLoveLan2
126
127 WHERE 总 ?=12
128
129 ) AS LiangLoveLan3
130
131 UNPIVOT(加班小时 FOR 日期IN([周一],[周二],[周三],[周四],[周五])) AS unpvt
132
133 ORDER BY 工号 ;
134
135

 

 

 

/*

日期                  工号   加班小时 -------------------- ---- -----------

周一                  A001 3

周二                  A001 1

周三                  A001 1

周四                  A001 2

周五                  A001 5

 

(5 row(s) affected)

 

*/

 

 

 

问题二

 

把销售表和结存表汇总成一个表  
  现在要把月份加进去统计,请问要怎么写?  
   
   
  销售表:    
  日期               单据号码               客户名称             送货       开票      
  2006-01-2           送630                   亨通                     6                  
  2006-01-12         送631                   亨通                     4                  
  2006-01-16         送639                   金田电工             6                                                
  2006-01-20         开237                   云通电子                           2  
  2006-01-21         开238                   金田电工                           4      
  2006-01-24         送642                   长城高新             10  
  2006-02-2           送630                   亨通                     6                  
  2006-02-12         送631                   亨通                     4                  
  2006-02-16         送639                   金田电工             6                                                
  2006-02-20         开237                   云通电子                           1  
  2006-02-21         开238                   金田电工                           4      
  2006-02-24         送642                   长城高新             10  
   
  结存表:  
  客户名称         月份             结存  
      亨通             2005-12           4  
  云通电子         2005-12           3  
  金田电工         2005-12           8  
  长城高新         2005-12           1  
      亨通             2006-01           14  
  云通电子         2006-01           1  
  金田电工         2006-01           10  
  长城高新         2006-01           11  
   
   
  现在要得到每个客户的销售汇总表(本期结存=上期结存+送货-开票)  
  日期               单据号码               客户名称             送货       开票       结存  
                          上期结存               亨通                                                 4          
  2006-01-2           送630                   亨通                     6                  
  2006-01-12         送631                   亨通                     4        
                            本期结存             亨通                                                 14  
                          上期结存               金田电工                                         8        
  2006-01-16         送639                   金田电工             6        
  2006-01-21         开238                   金田电工                           4    
                          本期结存               金田电工                                         10  
                          上期结存               云通电子                                         3  
  2006-01-20         开237                   云通电子                           2        
                          本期结存               云通电子                                         1  
                          上期结存               长城高新                                         1        
  2006-01-24         送642                   长城高新             10  
                          本期结存               长城高新                                         11      
                        200601合计                                         26             6           28  
                          上期结存               亨通                                                 14          
  2006-01-2           送630                   亨通                     6                  
  2006-01-12         送631                   亨通                     4        
                            本期结存             亨通                                                 24  
                          上期结存               金田电工                                         10      
  2006-01-16         送639                   金田电工             6        
  2006-01-21         开238                   金田电工                           4    
                          本期结存               金田电工                                         12  
                          上期结存               云通电子                                         1  
  2006-01-20         开237                   云通电子                           1        
                          本期结存               云通电子                                         0  
                          上期结存               长城高新                                         11        
  2006-01-24         送642                   长城高新             10                      
                          本期结存               长城高新                                         21  
                          200602合计                                         26           5           57        

 

 

 

 

--答案
    
  

代码

1 create table sale(rq datetime,num varchar(20),customer varchar(30),send int,code int)
2 insert into sale
3 select '2006-01-02','送630','亨通',6,null union all
4 select '2006-01-12','送631','亨通',4,null union all
5 select '2006-01-16','送639','金田電子',6,null union all
6 select '2006-01-20','開237','雲通電子',null,2 union all
7 select '2006-01-21','開238','金田電子',null,4 union all
8 select '2006-01-24','送642','長城高新',10,null union all
9 select '2006-02-02','送630','亨通',6,null union all
10 select '2006-02-12','送631','亨通',4,null union all
11 select '2006-02-16','送639','金田電子',6,null union all
12 select '2006-02-20','開237','雲通電子',null,1 union all
13 select '2006-02-21','開238','金田電子',null,4 union all
14 select '2006-02-24','送642','長城高新',10,null
15
16 create table locate(customer varchar(30),monthly varchar(07),value int)
17 insert into locate
18 select '亨通','2005-12',4 union all
19 select '雲通電子','2005-12',3 union all
20 select '金田電子','2005-12',8 union all
21 select '長城高新','2005-12',1 union all
22
23 select '亨通','2006-01',14 union all
24 select '雲通電子','2006-01',1 union all
25 select '金田電子','2006-01',10 union all
26 select '長城高新','2006-01',11
27
28 select case

抱歉!评论已关闭.