难题求解【标题要【长】【长】【长】【长】【长】【长】【长】【长】】

王向飞 2010-10-11 01:07:31
求思路


用户ID    交易ID       交易值	
userId jiaoyiID value fangxiang
20100608 20100625001 50 买
20100608 20100625002 20 卖
20111609 20100625004 28 卖
20100608 20100625003 30 卖
20100608 20100625005 39 卖
20100608 20100625006 15 买
20100608 20100625007 11 买
20111609 20100625008 28 买
20111608 20100625009 10 买
20111608 20100625010 3 买


--结果要:
userId 平掉数量 买jiaoyiID 买value 卖jiaoyiID 卖value
20100608 20 20100625001 50 20100625002 20
20111609 28 20100625008 28 20100625004 28
20100608 30 20100625001 50 20100625002 30
20100608 15 20100625006 39 20100625005 15
20111608 11 20100625007 39 20100625005 11
20111608 10 20100625009 39 20100625005 10
20111608 3 20100625010 39 20100625005 3


1 根据客户号,交易ID先后顺序,先买进的要先被卖掉,这可以根据交易ID先后排序实现。
难点在 平掉数量 这一栏。

卖掉的总和不会超出手中目前有的数量。
如 20100608 先买50,分两次卖出20 和 30 。

每个客户只能买卖自己手中的数量。
即20100608 与 20111609 没有任何关系。
如何把这数量给拆分开?
...全文
222 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
王向飞 2010-10-12
  • 打赏
  • 举报
回复
谢谢大家的参与
jiao3630 2010-10-11
  • 打赏
  • 举报
回复
我是来学习的
王向飞 2010-10-11
  • 打赏
  • 举报
回复
终于知道大家为什么看不太明白了,把最后这一列 【卖value】 去掉。。
hovy_yang 2010-10-11
  • 打赏
  • 举报
回复
这..这..难道是个送分贴
叶子 2010-10-11
  • 打赏
  • 举报
回复
平掉数量 和 卖value 什么情况下不相等?
luxi0194 2010-10-11
  • 打赏
  • 举报
回复
买卖分为两个表,用关键字段链接进行加减。。。。。。
SQLCenter 2010-10-11
  • 打赏
  • 举报
回复
数据还是有点区别,不知道,你看一下:

--> 测试数据:#
if object_id('tempdb.dbo.#') is not null drop table #
create table #(userId int, jiaoyiID bigint, value int, fangxiang varchar(8))
insert into #
select 20100608, 20100625001, 50, '买' union all
select 20100608, 20100625002, 20, '卖' union all
select 20111609, 20100625004, 28, '卖' union all
select 20100608, 20100625003, 30, '卖' union all
select 20100608, 20100625005, 39, '卖' union all
select 20100608, 20100625006, 15, '买' union all
select 20100608, 20100625007, 11, '买' union all
select 20111609, 20100625008, 28, '买' union all
select 20111608, 20100625009, 10, '买' union all
select 20111608, 20100625010, 3, '买'

;with i as
(
select *, (select sum(value) from # where fangxiang='买' and jiaoyiID<=t.jiaoyiID)si from # t where fangxiang='买'
),
o as
(
select *, (select sum(value) from # where fangxiang='卖' and jiaoyiID<=t.jiaoyiID)so from # t where fangxiang='卖'
)
select i.userId, 平掉数量=
case
when (si-i.value)<=(so-o.value) then
case
when si<=so then si-(so-o.value)
else o.value
end
else
case
when si<=so then i.value
else so-(si-i.value)
end
end,
[买.jiaoyiID] = i.jiaoyiID,
[买.value] = i.value,
[卖.jiaoyiID] = o.jiaoyiID,
[卖.value] = o.value
from i,o where (si>so and si-so<i.value) or (si<=so and so-si<o.value) order by 3

/*
userId 平掉数量 买.jiaoyiID 买.value 卖.jiaoyiID 卖.value
----------- ----------- -------------------- ----------- -------------------- -----------
20100608 20 20100625001 50 20100625002 20
20100608 30 20100625001 50 20100625003 30
20100608 15 20100625006 15 20100625004 28
20100608 11 20100625007 11 20100625004 28
20111609 2 20100625008 28 20100625004 28
20111609 26 20100625008 28 20100625005 39
20111608 10 20100625009 10 20100625005 39
20111608 3 20100625010 3 20100625005 39
*/


纯粹交流,不需要特别给我多分,在这楼的兄弟都平分。
王向飞 2010-10-11
  • 打赏
  • 举报
回复
叫做买卖 可能会造成误解,没有买怎么能卖?
其实可以当成是数据流动的两种方向,一种向左 一种向右,寻求一种平衡。
向左流的会平掉一部分偏右的数据,
向右流的会平掉一部分向左的数据。
王向飞 2010-10-11
  • 打赏
  • 举报
回复
20100608 15 20100625006 39 20100625005 15
20111608 11 20100625007 39 20100625005 11
20111608 10 20100625009 39 20100625005 10
20111608 3 20100625010 39 20100625005 3

因为后面这几条对应的都是都是要跟 39 这笔交易 冲平啊
第一次冲了15 ,我用20100625006 这笔交易 15 冲 20100625006这笔交易的 39 ,
没有冲完
所以又有第二次交易 用 20100625007 交易的 11 ,再冲 20100625006这笔交易的 39 ,

意思就是 只要是买就按先后顺序冲上面卖掉的。
SQLCenter 2010-10-11
  • 打赏
  • 举报
回复
20111608只有买没有卖,怎么结果里面有卖的,数据是不是……
SQL2088 2010-10-11
  • 打赏
  • 举报
回复
还有中间这几笔

结果 为什么20100625006 39 都是39?
王向飞 2010-10-11
  • 打赏
  • 举报
回复
可以双向交易,
卖空买空
想想股票 期货就明白了
呵呵[Quote=引用 13 楼 sql2088 的回复:]
20111609 20100625004 28 卖
...
20111609 20100625008 28 买 -- 这一笔交易比上面这个小,??? 还没买,就卖
不好弄
[/Quote]
SQL2088 2010-10-11
  • 打赏
  • 举报
回复
20111609 20100625004 28 卖
...
20111609 20100625008 28 买 -- 这一笔交易比上面这个小,??? 还没买,就卖
不好弄
yanguohua2008 2010-10-11
  • 打赏
  • 举报
回复
貌似你现在的 平掉数量、卖value 始终是相等的嘛
playwarcraft 2010-10-11
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20100920/16/580c50b7-1a6b-45c3-83e6-3285e156ba89.html
playwarcraft 2010-10-11
  • 打赏
  • 举报
回复
等我找个类似的
SQLCenter 2010-10-11
  • 打赏
  • 举报
回复
树上的鸟儿应该清楚,就等于是库存/出库,先入先出那种,我现在忙呢,有例子你给他贴一个。
黄_瓜 2010-10-11
  • 打赏
  • 举报
回复
见过好多涉及到交易的数据库设计,都是用更多的表分开存储,会有些冗余
但计算,撤关系 方便了很多。
软件钢琴师 2010-10-11
  • 打赏
  • 举报
回复
先把行转列 就是把 买和卖 转为两列 ,然后用case 去实现并计算平掉数量
加载更多回复(5)

22,210

社区成员

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

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