问题一
--问题描述
--第一是.关于加班时 ?的问 ?
-- 公司规 ©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)
*/
问题二
把销售表和结存表汇总成一个表
现在要把月份加进去统计,请问要怎么写?
销售表:
日期 单据号码 客户名称 送货 开票
结存表:
客户名称 月份 结存
亨通 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
本期结存 亨通 14
上期结存 金田电工 8
本期结存 金田电工 10
上期结存 云通电子 3
本期结存 云通电子 1
上期结存 长城高新 1
本期结存 长城高新 11
200601合计 26 6 28
上期结存 亨通 14
本期结存 亨通 24
上期结存 金田电工 10
本期结存 金田电工 12
上期结存 云通电子 1
本期结存 云通电子 0
上期结存 长城高新 11
本期结存 长城高新 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