数据对应问题,分不够可以在加,zjcxc(邹建)paoluo(一天到晚游泳的鱼)等高手来帮忙
表如下:
物资编号 所在部门 发生日期 数量 单价 租金 收支类型
02129 公司物资部 2007-06-06 10.000 20.000 20 购入
021300001 西区项目部 2007-06-07 20.000 15.000 1.3 购入
02129 西区项目部 2007-06-07 15.000 11.000 20 购入
021300001 西区项目部 2007-06-08 10.000 20.000 1.3 购入
02129 西区项目部 2007-06-08 5.000 11.000 20 购入
02129 公司物资部 2007-06-06 1.000 20.000 20 调出
021300001 西区项目部 2007-06-07 3.000 20.000 1.3 调出
02129 西区项目部 2007-06-07 2.000 11.000 20 调出
020550001 西区项目部 2007-06-08 5.000 2.000 1.5 调出
02129 开发区项目部 2007-06-06 1.000 20.000 20 调入
021300001 开发区项目部 2007-06-07 3.000 20.000 1.3 调入
02129 开发区项目部 2007-06-07 2.000 11.000 20 调入
020550001 公司物资部 2007-06-08 5.000 2.000 1.5 调入
021300001 公司物资部 2007-06-08 10.000 10.000 0 报废
020550001 公司物资部 2007-06-09 12.000 1.667 0 期初
把这个记录整理成:
物资编号 所在部门 起始日期 结束日期 天数 数量
02129 公司物资部 2007-06-06 2007-06-06 0 1
02129 公司物资部 2007-06-06 2007-06-13 7 9
..........
规则:
1、起始日期为“期初”、“购入”、“调入”中的日期
结束日期为“调出”中的日期
2、如果“调出”的数量小于入库时的数量,则分为两条。如上
3、使用的为sqlserver2000数据库,发生日期的类型为char(10)
4、某个部门的某种物资没有完全调出时,结束日期为当前系统日期
各位帮忙谢谢
以下为物资02129的显示结果,日期2007-06-14取的是当前系统日期
02129 公司物资部 2007-06-06 2007-06-06 0 1
02129 公司物资部 2007-06-06 2007-06-14 8 9
(对应这两条
02129 公司物资部 2007-06-06 10.000 20.000 20 购入
02129 公司物资部 2007-06-06 1.000 20.000 20 调出 )
02129 西区项目部 2007-06-07 2007-06-07 0 2
02129 西区项目部 2007-06-07 2007-06-14 7 13
(对应这两条
02129 西区项目部 2007-06-07 15.000 11.000 20 购入
02129 西区项目部 2007-06-07 2.000 11.000 20 调出)
02129 西区项目部 2007-06-08 2007-06-14 6 5
(对应这一条
02129 西区项目部 2007-06-08 5.000 11.000 20 购入)
02129 开发区项目部 2007-06-06 2007-06-14 8 1
02129 开发区项目部 2007-06-07 2007-06-14 7 2
(对应这两条
02129 开发区项目部 2007-06-06 1.000 20.000 20 调入
02129 开发区项目部 2007-06-07 2.000 11.000 20 调入)
帮忙呀
[解决办法]
convert() min() max() group by
case 收支类型 when xxx then .... end
[解决办法]
举例不全
02129 开发区项目部 2007-06-06 2007-06-14 8 1
02129 开发区项目部 2007-06-07 2007-06-14 7 2
(对应这两条
02129 开发区项目部 2007-06-06 1.000 20.000 20 调入
02129 开发区项目部 2007-06-07 2.000 11.000 20 调入)
如果还有一条调出
02129 开发区项目部 2007-06-08 1.000 11.000 20 调出
该如何
也就是说多个入对应多个出的时候需要有个确定的算法
[解决办法]
http://community.csdn.net/Expert/topic/5494/5494759.xml?temp=5.494326E-02
楼主的题和这个差不多。。。那个叫分货~这个叫分赃... ^^
偶也想看看其它的高招。。期待中。。
[解决办法]
CREATE TABLE tb(
物资编号 varchar(100),
所在部门 nvarchar(100),
发生日期 datetime,
数量 decimal(24,3),
单价 decimal(24,3),
租金 decimal(24,3),
收支类型 nvarchar(10)
)
INSERT tb
SELECT '02129 ', N '公司物资部 ' , '2007-06-06 ' , 10.000 , 20.000 ,20 ,N '购入 ' UNION ALL
SELECT '021300001 ',N '西区项目部 ' , '2007-06-07 ' , 20.000, 15.000 , 1.3 ,N '购入 ' UNION ALL
SELECT '02129 ', N '西区项目部 ' , '2007-06-07 ' , 15.000 , 11.000 ,20 ,N '购入 ' UNION ALL
SELECT '021300001 ',N '西区项目部 ' , '2007-06-08 ' , 10.000 , 20.000 , 1.3 ,N '购入 ' UNION ALL
SELECT '02129 ', N '西区项目部 ' , '2007-06-08 ' , 5.000, 11.000 , 20 ,N '购入 ' UNION ALL
SELECT '02129 ', N '公司物资部 ' , '2007-06-06 ' , 1.000 , 20.000 , 20 ,N '调出 ' UNION ALL
SELECT '021300001 ',N '西区项目部 ' , '2007-06-07 ' , 3.000 , 20.000 , 1.3 ,N '调出 ' UNION ALL
SELECT '02129 ', N '西区项目部 ' , '2007-06-07 ' , 2.000 ,11.000, 20 ,N '调出 ' UNION ALL
SELECT '020550001 ',N '西区项目部 ' , '2007-06-08 ' , 5.000 , 2.000 ,1.5 ,N '调出 ' UNION ALL
SELECT '02129 ', N '开发区项目部 ' , '2007-06-06 ' , 1.000, 20.000 , 20 ,N '调入 ' UNION ALL
SELECT '021300001 ',N '开发区项目部 ' , '2007-06-07 ' , 3.000 ,20.000 , 1.3 ,N '调入 ' UNION ALL
SELECT '02129 ', N '开发区项目部 ' , '2007-06-07 ' , 2.000 , 11.000 , 20 ,N '调入 ' UNION ALL
SELECT '020550001 ',N '公司物资部 ' , '2007-06-08 ' , 5.000 , 2.000 , 1.5 ,N '调入 ' UNION ALL
SELECT '021300001 ',N '公司物资部 ' , '2007-06-08 ' , 10.000 , 10.000 , 0 ,N '报废 ' UNION ALL
SELECT '020550001 ',N '公司物资部 ' , '2007-06-09 ' , 12.000 , 1.667 , 0 ,N '期初 '
GO
DECLARE @dt datetime
SET @dt = DATEDIFF(Day, -1, GETDATE())
;WITH
OB1 AS(
SELECT
物资编号, 所在部门, 发生日期, 数量
FROM tb A
WHERE 收支类型 = N '调出 '
AND 发生日期 < @dt
),
IB AS(
SELECT
物资编号, 所在部门, 发生日期, 数量
FROM tb A
WHERE 收支类型 IN(N '期初 ', N '调入 ', N '购入 ')
AND 发生日期 < @dt
),
OD AS(
SELECT
物资编号, 所在部门,
发生日期 = @dt, 数量 = SUM(数量)
FROM(
SELECT
物资编号, 所在部门, 数量 = - 数量
FROM OB1
UNION ALL
SELECT
物资编号, 所在部门, 数量
FROM IB
)A
GROUP BY 物资编号, 所在部门
HAVING SUM(数量) > 0
),
OB AS(
SELECT
物资编号, 所在部门, 发生日期, 数量
FROM OB1
UNION ALL
SELECT
物资编号, 所在部门, 发生日期, 数量
FROM OD
),
O AS(
SELECT
物资编号, 所在部门, 发生日期, 数量,
qtySUM1 = ISNULL((
SELECT SUM(数量) FROM OB
WHERE 发生日期 < A.发生日期
AND 物资编号 = A.物资编号
AND 所在部门 = A.所在部门
), 0),
qtySUM2 = ISNULL((
SELECT SUM(数量) FROM OB
WHERE 发生日期 <= A.发生日期
AND 物资编号 = A.物资编号
AND 所在部门 = A.所在部门
), 0)
FROM OB A
),
I AS(
SELECT
物资编号, 所在部门, 发生日期, 数量,
qtySUM1 = ISNULL((
SELECT SUM(数量) FROM IB
WHERE 发生日期 < A.发生日期
AND 物资编号 = A.物资编号
AND 所在部门 = A.所在部门
), 0),
qtySUM2 = ISNULL((
SELECT SUM(数量) FROM IB
WHERE 发生日期 <= A.发生日期
AND 物资编号 = A.物资编号
AND 所在部门 = A.所在部门
), 0)
FROM IB A
),
RE AS(
SELECT
I.物资编号, I.所在部门,
起始日期 = I.发生日期 ,
结束日期 = O.发生日期,
天数 = DATEDIFF(Day, I.发生日期, O.发生日期),
I = CASE
WHEN I.qtySUM2 - O.qtySUM1 > I.数量 THEN I.数量
ELSE I.qtySUM2 - O.qtySUM1
END,
O = CASE
WHEN O.qtySUM2 - I.qtySUM1 > O.数量 THEN O.数量
ELSE O.qtySUM2 - I.qtySUM1
END
FROM I, O
WHERE O.发生日期 > = I.发生日期
AND O.qtySUM1 < I.qtySUM2
AND O.qtySUM2 > I.qtySUM1
AND O.物资编号 = I.物资编号
AND O.所在部门 = I.所在部门
)
SELECT
物资编号, 所在部门,
起始日期, 结束日期, 天数,
数量 = CASE WHEN O > I THEN I ELSE O END
FROM RE
ORDER BY 物资编号, 所在部门,
起始日期, 结束日期
GO
DROP TABLE tb