如何實現這樣的查詢?

csdyyr 2006-03-17 08:50:47
表A:
ITEM QTY
1261 10
. .
. .
. .
表B:
ITEM QTY PRICE DATE
1261 5 1.1 2006/03/01
1261 2 1.2 2006/03/05
1261 6 1.3 2006/03/15
1261 3 1.4 2006/03/20
. . . .
. . . .
. . . .
結果(從表B依日期取10件):
ITEM QTY PRICE AMT DATE
1261 5 1.1 5.5 2006/03/01
1261 2 1.2 2.4 2006/03/05
1261 3 1.3 3.9 2006/03/15

...全文
148 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
$扫地僧$ 2006-03-17
  • 打赏
  • 举报
回复
不好意思 !
上午答题很仓促!考虑不全!
其实不用游标也可以!!


create table A
(
ITEM varchar(10),
QTY int
)

create table B
(
ITEM varchar(10),
QTY int,
PRICE decimal(18,1),
Date datetime
)

insert A select '1261',10

insert B select '1261',5,1.1,'2006-03-01'
insert B select '1261',2,1.2,'2006-03-05'
insert B select '1261',6,1.3,'2006-03-15'
insert B select '1261',3,1.4,'2006-03-20'

create view V_Test
as
select A1.ITEM,
case when(A1.QTY>=(select sum(QTY) from B where date<=B1.date and ITEM=B1.ITEM)) then B1.QTY
else abs((select sum(QTY) from B where date<=B1.date and ITEM=B1.ITEM)-A1.QTY) end QTY,
Date
from A A1,B B1
where A1.ITEM=B1.ITEM

---------
select * from
(select B1.ITEM,
case when A1.QTY>=(select sum(QTY) from V_Test where T.ITEM=ITEM and date<=T.date) then T.QTY else 0 end as QTY,
B1.PRICE,
(case when A1.QTY>=(select sum(QTY) from V_Test where T.ITEM=ITEM and date<=T.date) then T.QTY else 0 end)*B1.PRICE as ARM,
B1.date
from B B1,V_Test T,A A1
where B1.ITEM=T.ITEM and B1.Date=T.Date and B1.ITEM=A1.ITEM) T
where QTY>0

--------------
1261 5 1.1 5.5 2006-03-01 00:00:00.000
1261 2 1.2 2.4 2006-03-05 00:00:00.000
1261 3 1.3 3.9 2006-03-15 00:00:00.000
  • 打赏
  • 举报
回复
学习一下,楼主描述一下自己的需求功能吧!单从结果上看,实现起来还是比较方便的!
csdyyr 2006-03-17
  • 打赏
  • 举报
回复
如果是上面这种情况,
那么楼主要求最短时间内的累计10,还是要求最少记录的累计10?
-------------------------------------------------------
其實是從最近的日期向後取(思路相同):
ITEM QTY PRICE DATE
1261 5 1.1 2006/03/01
1261 2 1.2 2006/03/05
1261 6 1.3 2006/03/15
要取10件==>
2006/03/01 : 只取2件

2006/03/05 : 取2件

2006/03/15 : 取6件
csdyyr 2006-03-17
  • 打赏
  • 举报
回复
用游标可以吗!???
数量多不多阿!?
---------------------
数量很多


我看lz的10 是从A表上来的阿!
也就是说 其它的产品可能不一定是10
真是这样的话!就只有用游标了!!
------------------------------
10 是从A表上来的
csdyyr 2006-03-17
  • 打赏
  • 举报
回复
非常感謝 scmail81(琳·风の狼) ! 寫得太巧妙了!
SQL_study 2006-03-17
  • 打赏
  • 举报
回复
全是红星的?
学习~
$扫地僧$ 2006-03-17
  • 打赏
  • 举报
回复
我游标还不完善!!lz自己调一下咯!我没时间咯!^_^!!
$扫地僧$ 2006-03-17
  • 打赏
  • 举报
回复
我看lz的10 是从A表上来的阿!
也就是说 其它的产品可能不一定是10
真是这样的话!就只有用游标了!!
$扫地僧$ 2006-03-17
  • 打赏
  • 举报
回复
create table A
(
ITEM varchar(10),
QTY int
)

create table B
(
ITEM varchar(10),
QTY int,
PRICE decimal(18,1),
Date datetime
)

insert A select '1261',10

insert B select '1261',5,1.1,'2006-03-01'
insert B select '1261',2,1.2,'2006-03-05'
insert B select '1261',6,1.3,'2006-03-15'
insert B select '1261',3,1.4,'2006-03-20'


Declare T_SC cursor for Select ITEM,QTY from A
declare @ITEM varchar(10)
declare @QTY int
declare @QTY1 int
declare @PRICE decimal(18,1)
declare @Date datetime
declare @T table (ITEM varchar(10),QTY int,PRICE decimal(18,1),AIM decimal(18,1),Date datetime)
open T_SC
fetch next from T_SC into @ITEM,@QTY
while @@FETCH_STATUS=0
begin
Declare T_SC1 cursor for Select QTY,PRICE,Date from B where ITEM=@ITEM order by Date
open T_SC1
fetch next from T_SC1 into @QTY1,@PRICE,@Date
while @@FETCH_STATUS=0
begin
if @QTY<=@QTY1
begin
insert @T select @ITEM,@QTY,@PRICE,@QTY*@PRICE,@Date
set @QTY=0
end
else
begin
insert @T select @ITEM,@QTY1,@PRICE,@QTY*@PRICE,@Date
set @QTY=@QTY-@QTY1
end
fetch next from T_SC1 into @QTY1,@PRICE,@Date
end
close T_SC1
deallocate T_SC1
end
fetch next from T_SC into @ITEM,@QTY
close T_SC
deallocate T_SC

select * from @t where QTY>0
rivery 2006-03-17
  • 打赏
  • 举报
回复
如果是上面这种情况,
那么楼主要求最短时间内的累计10,还是要求最少记录的累计10?
rivery 2006-03-17
  • 打赏
  • 举报
回复
好像不对啊。
楼主的筛选是按照日期必须满足一定数量的累计(10)?超出的不符合?
rivery 2006-03-17
  • 打赏
  • 举报
回复
declare @t table(item int,qty int ,price numeric(5,2),[date] datetime)
insert into @t
select 1261,5,1.1,'2006/3/1' union
select 1261,2,1.2,'2006/3/5' union
select 1261,6,1.3,'2006/3/15' union
select 1261,3,1.4,'2006/3/20'

select *,flag=case when (select sum(qty) from @t where [date]<=a.[date])<10 then 0
else case when (select sum(qty) from @t where [date]<a.[date])>=10 then 2
else 1 end
end
from @t a
order by [date]
/*
说明:flag为0得代表累计未满10得,为1得代表临界点(累计>=10的),为2得代表超出部分。
楼主根据需要以此为结果集进行筛选
1261 5 1.10 2006-03-01 00:00:00.000 0
1261 2 1.20 2006-03-05 00:00:00.000 0
1261 6 1.30 2006-03-15 00:00:00.000 1
1261 3 1.40 2006-03-20 00:00:00.000 2
*/
lsqkeke 2006-03-17
  • 打赏
  • 举报
回复
先进先出
$扫地僧$ 2006-03-17
  • 打赏
  • 举报
回复
用游标可以吗!???
数量多不多阿!?

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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