一个SQL查询问题,急急急!!!!!

carychuang 2012-12-26 11:47:43
PROD PRODQTY OPR QTY DATE
A01 100 A 5 2012-01-01
A01 100 B 25 2012-01-02
A01 100 C 35 2012-01-03
A01 100 D 15 2012-01-04
A01 100 E 15 2012-01-05
A01 100 f 10 2012-01-06
A01 100 g 12 2012-01-07
A02 50 Aa 5 2012-02-01
A02 50 Ba 10 2012-02-02
A02 50 Ca 20 2012-02-03
A02 50 Da 16 2012-02-04
A02 50 Ea 15 2012-02-05
A02 50 fa 10 2012-02-06
A02 50 ga 12 2012-02-07
... ... ... ... ...


根据PROD,PRODQTY,汇总QTY,按DATE升序排列,当汇总数大于或等于PRODQTY的话
那么就取出来那一条记录(每个PRODI只取一条记录)

如:
PROD PRODQTY OPR QTY DATE
A01 100 E 10 2012-01-05
A02 50 Da 16 2012-02-04
... ... ... ... ...
...全文
115 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
-晴天 2012-12-26
  • 打赏
  • 举报
回复
楼主的结果有点错.
create table tb(PROD varchar(10),PRODQTY INT,OPR varchar(10),QTY int,DATE datetime)
insert into tb select '1',100,'A',5,'2012-01-01'
insert into tb select '1',100,'B',25,'2012-01-02'
insert into tb select '1',100,'C',35,'2012-01-03'
insert into tb select '1',100,'D',15,'2012-01-04'
insert into tb select '1',100,'E',15,'2012-01-05'
insert into tb select '1',100,'f',10,'2012-01-06'
insert into tb select '1',100,'g',12,'2012-01-07'
insert into tb select '2',50,'Aa',5,'2012-02-01'
insert into tb select '2',50,'Ba',10,'2012-02-02'
insert into tb select '2',50,'Ca',20,'2012-02-03'
insert into tb select '2',50,'Da',16,'2012-02-04'
insert into tb select '2',50,'Ea',15,'2012-02-05'
insert into tb select '2',50,'fa',10,'2012-02-06'
insert into tb select '2',50,'ga',12,'2012-02-07'
go
;with cte as(
select * from tb a where exists(select 1 from tb b where prod=a.prod and date<=a.date group by prod having sum(qty)>=a.prodqty)
)select * from cte a where not exists(select 1 from cte where prod=a.prod and date<a.date)
/*
PROD       PRODQTY     OPR        QTY         DATE
---------- ----------- ---------- ----------- -----------------------
1          100         f          10          2012-01-06 00:00:00.000
2          50          Da         16          2012-02-04 00:00:00.000

(2 行受影响)

*/
go
drop table tb
Mr_Nice 2012-12-26
  • 打赏
  • 举报
回复
SELECT  TB.*
FROM    TB
        INNER JOIN ( SELECT TOP 1
                            A.date ,
                            A.prodqty ,
                            A.PROD ,
                            SUM(B.QTY) AS qty
                     FROM   dbo.TB A
                            INNER JOIN TB B ON A.date >= B.date
                     GROUP BY A.date ,
                            A.prodqty ,
                            A.PROD
                     HAVING SUM(B.QTY) <= A.prodqty
                     ORDER BY a.date DESC
                   ) T ON T.date = TB.date
                          AND T.prod = TB.prod
UNION ALL
SELECT  TB.*
FROM    TB
        INNER JOIN ( SELECT TOP 1
                            A.date ,
                            A.prodqty ,
                            A.PROD ,
                            SUM(B.QTY) AS qty
                     FROM   dbo.TB A
                            INNER JOIN TB B ON A.date <= B.date AND A.prod =B.prod
                     GROUP BY A.date ,
                            A.prodqty ,
                            A.PROD
                     HAVING SUM(B.QTY) > A.prodqty
                     ORDER BY a.date DESC
                   ) T ON T.date = TB.date
                          AND T.prod = TB.prod
哥眼神纯洁不 2012-12-26
  • 打赏
  • 举报
回复

with TB(PROD,PRODQTY,OPR,QTY ,DATE)as  
(
select 'A01',100,'A',5,'2012-01-01' union all
select 'A01',100,'B',25,'2012-01-02' union all
select 'A01',100,'C',35,'2012-01-03' union all
select 'A01',100,'D',15,'2012-01-04' union all
select 'A01',100,'E',15,'2012-01-05' union all
select 'A01',100,'f',10,'2012-01-06' union all
select 'A01',100,'g',12,'2012-01-07' union all
select 'A02',50,'Aa',5,'2012-02-01' union all
select 'A02',50,'Ba',10,'2012-02-02' union all
select 'A02',50,'Ca',20,'2012-02-03' union all
select 'A02',50,'Da',16,'2012-02-04' union all
select 'A02',50,'Ea',15,'2012-02-05' union all
select 'A02',50,'fa',10,'2012-02-06' union all
select 'A02',50,'ga',12,'2012-02-07'
)
select * from tb where prod+date in 
(select prod+date from 
(select row_number() over(partition by a.prod order by a.prod)number,a.PROD,a.PRODQTY,a.date,SUM(b.QTY)qty 
from tb a, TB b where a.DATE>=b.DATE and a.PROD=b.PROD
group by a.PROD,a.PRODQTY,a.date having SUM(b.QTY)>a.PRODQTY)a where number=1) 
yx94480915 2012-12-26
  • 打赏
  • 举报
回复
declare @a int declare @b int declare @c int declare @d int declare @pname varchar(20) declare @PRODQTY int declare @cnum int set @b = 1 set @d = 1 create table #test(id int IDENTITY(1,1),PROD varchar(20),PRODQTY int,counts int) create table #test2(PROD varchar(20),PRODQTY int,OPR VARCHAR(20),QTY INT,DATE VARCHAR(20)) insert into #test(PROD,PRODQTY,counts) SELECT PROD,PRODQTY,COUNT(QTY) FROM test001 GROUP BY PROD,PRODQTY order by prod select @a = count(*) from #test while (@b<=@a) begin select @pname = prod,@c = counts,@PRODQTY = PRODQTY from #test where id = @b while (@d<=@c) begin select @cnum = sum(aa.QTY) from (select top(@d)QTY from test001 where PROD = @pname order by date) as aa if (@cnum > @PRODQTY ) begin insert into #test2(PROD,PRODQTY,OPR,QTY,DATE) select top(1)bb.* from (select top(@d) * from test001 where PROD = @pname order by date)as bb order by bb.date desc goto t end set @d = @d + 1 end t: set @b = @b + 1 end SELECT * FROM #test2 drop table #test drop table #test2 把test001改成你的表名就OK了!

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧