日期:2014-05-18  浏览次数:20616 次

计件工资标准查询问题
单位计件工资标准会根据实际的情况不定期调整(一般不会一个月调整2次),要求工资报表能根据所在不同期间取出对应期间的工资标准来计算计件工资。
具体如下:
表A(标准表)此表中数据根据实际生产情况会不定期调整,有时的产品上月设定的标准,次月就要调整,有的设定后几个月都不会调整,没有出新标准的产品就沿用以前的标准。
标准启用日期 产品名称 每模件数 计件单价
2007-01-01 A 8 0.1
2007-01-01 A 16 0.05
2007-01-01 B 8 0.6
2007-05-01 A 8 0.1
2007-05-01 A 16 0.05
2007-05-01 B 8 0.6
2007-05-01 C 16 0.3
表B(产量表)
生产日期 员工 产品名称 每模件数 产量
2007-06-08 A A 8 1000
2007-06-08 B A 16 8000
2007-06-08 A B 8 5000
2007-06-08 B C 16 2000
2007-06-08 C A 8 5000

要求根据标准启用日期与产量表上的生产日期比较,调用对应的期间单价计算产量发生期间的产品计件工资
例中结果应该是:
  员工 产品名称 每模件数 产量 计件工资
  A A 8 1000 100
  A B 8 5000 3000
  B A 16 8000 400
  B C 16 2000 600
  C A 8 5000 500  
-------------------------
另外,顺便问一下,各位对于计件工资单价的处理这个问题是用的啥方法,都说来听听?


------解决方案--------------------
前面的少了一项型号的比较

CREATE TABLE A(S_DATE DATETIME,ITEM_CODE NVARCHAR(20),PIECE INT,PRICE MONEY)
INSERT A(S_DATE,ITEM_CODE,PIECE,PRICE)
SELECT '2007-01-01','A',8 ,0.1 UNION ALL
SELECT '2007-01-01','A',16 ,0.05 UNION ALL
SELECT '2007-01-01','B',8 ,0.6 UNION ALL
SELECT '2007-05-01','A',8 ,0.1 UNION ALL
SELECT '2007-05-01','A',16 ,0.05 UNION ALL
SELECT '2007-05-01','B',8 ,0.6 UNION ALL
SELECT '2007-05-01','C',16 ,0.3 
SELECT * FROM A WHERE S_DATE>='2007-5-1'

CREATE TABLE B(IN_DATE DATETIME,PER_CODE NVARCHAR(10),ITEM_CODE NVARCHAR(20),PIECE INT,IN_QTY INT)
INSERT B(IN_DATE,PER_CODE,ITEM_CODE,PIECE,IN_QTY)
SELECT '2007-06-08','A','A', 8 ,1000 UNION ALL
SELECT '2007-06-08','B','A', 16 ,8000 UNION ALL
SELECT '2007-06-08','A','B', 8 ,5000 UNION ALL
SELECT '2007-06-08','B','C', 16 ,2000 UNION ALL
SELECT '2007-06-08','C','A', 8 ,5000 
--SELECT * FROM B

-- 明细表的工资列表
SELECT 
*,
单价=(SELECT TOP 1 ISNULL(PRICE,0) FROM A WHERE ITEM_CODE=B.ITEM_CODE AND PIECE=B.PIECE AND S_DATE<=B.IN_DATE ORDER BY S_DATE DESC),
工资=IN_QTY*(SELECT TOP 1 ISNULL(PRICE,0) FROM A WHERE ITEM_CODE=B.ITEM_CODE AND PIECE=B.PIECE AND S_DATE<=B.IN_DATE ORDER BY S_DATE DESC)
FROM B
ORDER BY PER_CODE,ITEM_CODE

DROP TABLE A
DROP TABLE B