大虾们, 求救了, 麻烦问题...

icelovey 2009-11-10 10:29:19

DECLARE @TB TABLE
(
F1 NVARCHAR(10),
F2 FLOAT,
F3 FLOAT
)
INSERT INTO @TB
SELECT 'A', 40, 0
UNION SELECT 'A', 20, 0
UNION SELECT 'A', 10, 0
UNION SELECT 'B', 20, 0
UNION SELECT 'B', 30, 0

有另外一个表限定A的数量总和必须为200, B必须为100.
如果总数达不到的话, 按照百分比进行分配, 将得到的数量填入C.如下

F1 F2 F3 F3最终
A 40 74.28 73
A 20 37.14 38
A 10 18.57 19
B 20 20 20
B 30 30 30

A的总数为70, 则需要添加数量为200-70=130. 然后按照百分比分配
因为数量必须为整数且不允许超出200的总数,所以除最大数量(40)之外,
其他做CEILING, 然后最大数量在用130减去已经分配的数量130-38-19=73

头都搞大了, 怎么也算不好, 也不知道描述清楚没, 还有可能都出现2个40的情况, 还要随机取一个去分配..能不能搞定啊.
...全文
232 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
fanzhouqi 2009-11-10
  • 打赏
  • 举报
回复

F1 F2 F3 F3最终
A 40 74.28 73
A 20 37.14 38
A 10 18.57 19

不是 四舍五入的吗?
zoffor 2009-11-10
  • 打赏
  • 举报
回复

-- 能憋出来结果我就开心了。。。看看有人比我复杂吗
create TABLE #tb
(
F1 NVARCHAR(10),
F2 FLOAT,
F3 FLOAT
)
INSERT INTO #tb
SELECT 'A', 40, 0
UNION SELECT 'A', 20, 0
UNION SELECT 'A', 10, 0
UNION SELECT 'B', 20, 0
UNION SELECT 'B', 30, 0

create table #TB2(F1 char(1),MaxF2 int)
insert #TB2 select 'a',200
insert #TB2 select 'B',100

with cte as(
select t.F1,T.F2, t.F2/sm.SumF2*(t2.MaxF2 - sm.SumF2) as q, t2.MaxF2 - sm.SumF2 as P from
#tb t
join
(select F1,SUM(F2) As SumF2 from #tb group by F1) sm on(t.F1 = sm.F1)
join
#TB2 t2 on (t.F1 = t2.F1)
)
,cte2 as (
select xx.F1, f2,
case when SeqNo > 1 then ceiling(q) else 0 end as q1
,q,p,SeqNo
from
(
select F1,f2,Q ,P ,ROW_NUMBER() over (partition by F1 order by q desc) as SeqNo from cte x
) xx
)
select f1,F2,Q,
(case when seqno = 1 then (select P-SUM(q1) from cte2 where F1 = xxx.F1 and seqno >1 group by F1,p)
else q1
end)
from cte2 xxx

--A 40 74.2857142857143 73
--A 20 37.1428571428571 38
--A 10 18.5714285714286 19
--B 30 30 30
--B 20 20 20


nianran520 2009-11-10
  • 打赏
  • 举报
回复
--有多个最大值就用临时表
DECLARE @table TABLE
(
F1 NVARCHAR(10),
F2 FLOAT,
F3 FLOAT
)
INSERT INTO @table
SELECT 'A', 40, 0
UNION all SELECT 'A', 40, 0
UNION all SELECT 'A', 10, 0
UNION all SELECT 'B', 20, 0
UNION all SELECT 'B', 30, 0
UNION all SELECT 'C', 20, 0
UNION all SELECT 'C', 30, 0
UNION all SELECT 'C', 10, 0

select identity(int,1,1) as id,* into #table from @table order by F1,F2 desc

select F1,F2,case id when (select min(id) from #table where r.F1=F1) then
(case F1 when 'A' then 200 else 100 end) - (select sum(F2) from #table where r.F1=F1) -
(select sum(F3) from (select id,F1,F2,case id when (select min(id) from #table where t.F1=F1) then 0
else ceiling(((case F1 when 'A' then 200 else 100 end) -
(select sum(F2) from #table where t.F1=F1))*F2/(select sum(F2) from #table where t.F1=F1)) end as [F3]
from #table t) k where k.F1 = R.F1)
else F3 end as [F3]
from (select id,F1,F2,
case id when (select min(id) from #table where t.F1=F1) then 0
else ceiling(((case F1 when 'A' then 200 else 100 end) -
(select sum(F2) from #table where t.F1=F1))*F2/(select sum(F2) from #table where t.F1=F1)) end as [F3]
from #table t) r

drop table #table
icelovey 2009-11-10
  • 打赏
  • 举报
回复
谢谢楼上, 我整理一下看看,
高手的代码风格果然不同一般-_-!!
nianran520 2009-11-10
  • 打赏
  • 举报
回复

--Ken Wong
--测试数据
DECLARE @table TABLE
(
F1 NVARCHAR(10),
F2 FLOAT,
F3 FLOAT
)
INSERT INTO @table
SELECT 'A', 40, 0
UNION SELECT 'A', 20, 0
UNION SELECT 'A', 10, 0
UNION SELECT 'B', 20, 0
UNION SELECT 'B', 30, 0
--查询
select F1,F2,case F2 when (select max(F2) from @table where r.F1=F1) then
(case F1 when 'A' then 200 else 100 end) - (select sum(F2) from @table where r.F1=F1) -
(select sum(F3) from (select F1,F2,
case F2 when (select max(F2) from @table where t.F1=F1) then 0
else ceiling(((case F1 when 'A' then 200 else 100 end) -
(select sum(F2) from @table where t.F1=F1))*F2/(select sum(F2) from @table where t.F1=F1)) end as [F3]
from @table t) k where k.F1 = R.F1 )
else F3 end as [F3]
from (select F1,F2,
case F2 when (select max(F2) from @table where t.F1=F1) then 0
else ceiling(((case F1 when 'A' then 200 else 100 end) -
(select sum(F2) from @table where t.F1=F1))*F2/(select sum(F2) from @table where t.F1=F1)) end as [F3]
from @table t) r
--结果
--------------------------
A 10.0 19.0
A 20.0 38.0
A 40.0 73.0
B 20.0 20.0
B 30.0 30.0
icelovey 2009-11-10
  • 打赏
  • 举报
回复
自己顶一下, 希望有好点的方法, 不然就用自己的笨办法啦
bancxc 2009-11-10
  • 打赏
  • 举报
回复
恩 帮顶
icelovey 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fredrickhu 的回复:]
有点难 不会帮顶
[/Quote]

啊 , 小F都不会了, 看来没戏了...
icelovey 2009-11-10
  • 打赏
  • 举报
回复
唉是哦, 我搞了半天, 结果是能出来, 但是很笨的算法..所以想来这里看看有没有什么新鲜点的方法呢
SQL77 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 icelovey 的回复:]
啊, 这么简单???我试试
[/Quote]
看错了,呵呵,这么复杂帮顶
--小F-- 2009-11-10
  • 打赏
  • 举报
回复
有点难 不会帮顶
icelovey 2009-11-10
  • 打赏
  • 举报
回复

Msg 8120, Level 16, State 1, Line 14
选择列表中的列 '@TB.F3' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
icelovey 2009-11-10
  • 打赏
  • 举报
回复
啊, 这么简单???我试试
SQL77 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sql77 的回复:]
SQL codeSELECT A.*,
(SELECTSUM(F2)*F3FROM TBWHERE F1=A.F1GROUPBY F1)AS F3最终FROM TB A
[/Quote]
弄错了,
SQL77 2009-11-10
  • 打赏
  • 举报
回复
SELECT A.*,
(SELECT SUM(F2)*F3 FROM TB WHERE F1=A.F1 GROUP BY F1)AS F3最终
FROM TB A
dawugui 2009-11-10
  • 打赏
  • 举报
回复
有请小P梁.
icelovey 2009-11-10
  • 打赏
  • 举报
回复
好啦, 采用你的....呵呵, 我喜欢CTE...结贴
icelovey 2009-11-10
  • 打赏
  • 举报
回复
SORRY...-_-!!
只注意研究下面代码去了,,
zoffor 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 icelovey 的回复:]
引用 22 楼 zoffor 的回复:
难道重复记录我的测试结果不正确吗


其实你的也算正确啦, 谢谢你的帮忙啦, 只是如果2个10的话, 只出来一个
[/Quote]
是你自己搞错了。
INSERT INTO #tb
SELECT 'A', 40, 0
UNION SELECT 'A', 20, 0
UNION SELECT 'A', 10, 0
UNION SELECT 'A', 10, 0
UNION SELECT 'B', 20, 0
UNION SELECT 'B', 30, 0
本来就是只插入一个10,一个20
要用union all
搞得我疑神疑鬼
icelovey 2009-11-10
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 zoffor 的回复:]
难道重复记录我的测试结果不正确吗
[/Quote]

我研究下, 看能不能把你的改造下, 刚学CTE, 比较感兴趣, 新东东....
加载更多回复(7)
你想当“李逍遥”式的“大侠”吗? 这里无需计算机基础,无需编程经验,你也不必是计算机专业的在校大学生....只要爱好游戏,怀揣梦想! 有一定自主学习能力,跟着刘老师从“编程小白”修炼为游戏研发“大虾”吧!!!学习好Unity,其先决条件是一定要有稳固、扎实的编程基础!课程 《C# For Unity系列之入门篇》配套学习资料链接:http://pan.baidu.com/s/1gflxreN 密码:sou5;刘老师讲Unity学员群(2) 497429806一、热更新系列(技术含量:中高级):A:《lua热更新技术中级篇》https://edu.csdn.net/course/detail/27087B:《热更新框架设计之Xlua基础视频课程》https://edu.csdn.net/course/detail/27110C:《热更新框架设计之热更流程与热补丁技术》https://edu.csdn.net/course/detail/27118D:《热更新框架设计之客户端热更框架(上)》https://edu.csdn.net/course/detail/27132E:《热更新框架设计之客户端热更框架(中)》https://edu.csdn.net/course/detail/27135F:《热更新框架设计之客户端热更框架(下)》https://edu.csdn.net/course/detail/27136二:框架设计系列(技术含量:中级): A:《游戏UI界面框架设计系列视频课程》https://edu.csdn.net/course/detail/27142B:《Unity客户端框架设计PureMVC篇视频课程(上)》https://edu.csdn.net/course/detail/27172C:《Unity客户端框架设计PureMVC篇视频课程(下)》https://edu.csdn.net/course/detail/27173D:《AssetBundle框架设计_框架篇视频课程》https://edu.csdn.net/course/detail/27169三、Unity脚本从入门到精通(技术含量:初级)A:《C# For Unity系列之入门篇》https://edu.csdn.net/course/detail/4560B:《C# For Unity系列之基础篇》https://edu.csdn.net/course/detail/4595C: 《C# For Unity系列之中级篇》https://edu.csdn.net/course/detail/24422D:《C# For Unity系列之进阶篇》https://edu.csdn.net/course/detail/24465四、虚拟现实(VR)与增强现实(AR):(技术含量:初级)A:《虚拟现实之汽车仿真模拟系统 》https://edu.csdn.net/course/detail/26618五、Unity基础课程系列(技术含量:初级) A:《台球游戏与FlappyBirds—Unity快速入门系列视频课程(第1部)》 https://edu.csdn.net/course/detail/24643B:《太空射击与移动端发布技术-Unity快速入门系列视频课程(第2部)》https://edu.csdn.net/course/detail/24645 C:《Unity ECS(二) 小试牛刀》https://edu.csdn.net/course/detail/27096六、Unity ARPG课程(技术含量:初中级):A:《MMOARPG地下守护神_单机版实战视频课程(上部)》https://edu.csdn.net/course/detail/24965B:《MMOARPG地下守护神_单机版实战视频课程(中部)》https://edu.csdn.net/course/detail/24968C:《MMOARPG地下守护神_单机版实战视频课程(下部)》https://edu.csdn.net/course/detail/24979

22,209

社区成员

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

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