SQL 条件求和 并赋值到同一张表里

A表第一列和第二列分别是名称、数量:
例如:
名称 数量
甲 1
乙 2
甲 3
乙 4
现在要增加一列:占比(在相同名称中对应数量的占比)。结果应该是这样的:
名称 数量 占比
甲 1 25%
乙 2 40%
甲 3 75%
乙 3 60%
因为占比在以后还要再用,所以要把结果写在原来的表里面,而不是通过SELECT计算。

原表中增加一列,然后再update一下。
alter table A add 占比 VARCHAR(10);
update A t1 set 占比=(select cast(t2.数量/sm*100 as varchar(3))+'%' from A t2,(select 名称,sum(数量)sm from A group by 名称)t3 where t1.名称=t2.名称 and t1.数量=t2.数量 and t2.名称=t3.名称);
试试看,有问题再追问。

追问

提示:'t1' 附近有语法错误。
sm是什么意思?

追答

上面是oralce的写法 sqlserver好像不支持呢 sm是总量

追问

没事,我改了一下,可以计算了。
但是实际情况中,不只有这几列数据,还有日期,产品,等等。
求和的时候要忽略日期列和产品列。
赋值的时候会提示:子查询返回的值不止一个。当子查询跟随在 =、!=、、>= 之后,或子查询用作表达式时,这种情况是不允许的。

追答上面是oralce的写法  sqlserver好像不支持呢  sm是总量 下面的应该没有问题。
update A set 占比=cast(CAST(t2.数量 as float)/sm*100 as varchar(3))+'%'
from A t2,(select 名称,sum(数量)sm from A group by 名称)t3
where t2.名称=t3.名称

追问

赋值的时候,会报错,怎么办?
子查询返回的值不止一个。当子查询跟随在 =、!=、、>= 之后,或子查询用作表达式时,这种情况是不允许的。

追答

报错?我上面贴的代码试过了,没有问题的。你说的子查询什么的,把你的代码和场景贴出来看看,听你这么空说挺吃力的。

追问

谢谢,之前的问题解决了。但是会有和为0的情况。能加一下你的Q Q吗?这样消耗的财富值太多了。

追答

812184406

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-30
--先把select语句附给你
select A.名称,A.数量,cast((A.数量/b.总数) * 100 as varchar(10)) + '%' as 占比 from A left join 
(select 名称,sum(数量) as 总数 from A group by 名称) b on a.名称=b.名称

第2个回答  2013-12-30
看不出来,你的占比是怎么算出来的。没法回答。追问

不好意思,为了计算精确在第二个表里面把乙的4改成3了。以第二个表为准。
是这样的:
第一条记录,名称是甲,数量是1。对所有名称为甲的数量求和,和是4。就得到占比是25%(用1除以4)。
第二条记录,名称是乙,数量是2。对所有名称为乙的数量求和,和是5。就得到占比是40%(用2除以5)。
以此类推。

追答我改了一下第十行代码
update A t1
set 占比=(select 占比2
            from
           (
            select (t2.数量 * 100 / t3.数量2 || '%') 占比2,
                t2.名称
            from 
               A t2
            inner join   
               (select sum(数量) 数量2,名称 from A group by 名称) t3
            on t2.名称 = t3.名称
           ) t4

                      where t1..名称 = t4.名称

                )

相似回答