2,498
社区成员
发帖
与我相关
我的任务
分享
--创建测试数据表
create table Table1
(
[工号] varchar(10),
[日期] smalldatetime,
[产品名称] varchar(50),
[工序] varchar(50),
[定额数] int,
[完成数] int,
[系数] NUMERIC(10,2),
[工资] NUMERIC(10,2)
)
INSERT INTO Table1 VALUES('001','2007-10-1','插头','削皮',4500,3000,NULL,NULL)
INSERT INTO Table1 VALUES('001','2007-10-1','插头','外观',3500,3000,NULL,NULL)
INSERT INTO Table1 VALUES('001','2007-10-2','日规','包装',10000,8840,NULL,NULL)
INSERT INTO Table1 VALUES('001','2007-10-2','插头','外观',3500,3000,NULL,NULL)
INSERT INTO Table1 VALUES('001','2007-10-2','日规','削皮',4500,3000,NULL,NULL)
--开始查询
--将数据存入临时表#tmp操作,因为表一没有ID字段,如果有的话,直接在Table1表上操作更方便
SELECT IDENTITY(INT,1,1) AS Ord,Table1.* INTO #tmp FROM Table1
UPDATE #tmp SET [系数]=CAST([完成数] AS NUMERIC(10,2))/CAST([定额数] AS NUMERIC(10,2))
UPDATE #tmp SET [工资]=A.[工资] FROM
(
SELECT MAX(Ord) AS Ord,CASE WHEN SUM(系数)*20+10>30 THEN SUM(系数)*30 ELSE SUM(系数)*20+10 END AS [工资]
FROM #tmp GROUP BY [工号],DATEPART(year,[日期]),DATEPART(month,[日期]),DATEPART(day,[日期])
)A
WHERE #tmp.Ord=A.Ord
SELECT * FROM #tmp
--删除测试表
DROP TABLE #tmp
DROP TABLE TABLE1
--测试结果
--备注:在计算系数时,由于使用了四舍五入,(LZ的算法没有使用四舍五入),系数略有偏差,导致工资稍微高了一点
-- 打工的人不容易,别在工资上帮老板多剥削几毛钱,呵呵
-- 如果要不使用四舍五入,请LZ自行写更新语句,我就不提供了
/*
Ord 工号 日期 产品名称 工序 定额数 完成数 系数 工资
-------------------------------------------------------------------------------
1 001 2007-10-01 00:00:00 插头 削皮 4500 3000 .67 NULL
2 001 2007-10-01 00:00:00 插头 外观 3500 3000 .86 45.90
3 001 2007-10-02 00:00:00 日规 包装 10000 8840 .88 NULL
4 001 2007-10-02 00:00:00 插头 外观 3500 3000 .86 NULL
5 001 2007-10-02 00:00:00 日规 削皮 4500 3000 .67 72.30
*/