首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

数据对应有关问题,分不够可以在加,zjcxc(邹建)paoluo(一天到晚游泳的鱼)等高手来帮忙

2012-02-22 
数据对应问题,分不够可以在加,zjcxc(邹建)paoluo(一天到晚游泳的鱼)等高手来帮忙表如下:物资编号所在部门

数据对应问题,分不够可以在加,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

热点排行