SQL实在想不同
这是表结构:
incoming ppname pname name 数量
电话销售售后产品使用方法20
电话销售售后产品效果18
电话销售售后产品营养健康5
电话销售售后服务其他5
电话销售售后媒体广告1
电话销售售后媒体赞助1
电话销售售后政策其他21
电话销售售后政策退换货政策2
电话销售售后政策退款政策1
电话销售售后政策物流政策42
电话销售售前产品包装19
这是我想的到数据 不用百分比显示也可以 如47% 显示: 0.46511
incoming ppname pname name 数量 百分比
电话销售售后产品使用方法 20 47%
电话销售售后产品效果18 42%
电话销售售后产品营养健康 5 12%
电话销售售后服务其他5 100%
电话销售售后媒体广告1 50%
电话销售售后媒体赞助1 50%
电话销售售后政策其他21 32%
电话销售售后政策退换货政策2 2%
电话销售售后政策退款政策 1 3%
电话销售售后政策物流政策 42 64%
电话销售售前产品包装19 100%
[解决办法]
--incoming ppname pname name 数量select a.*,ltrim(cast(a.數量*100./nullif(b.數量,0) as decimal(12,2)))+'%' as 百分比from tb a outer apply (select sum(數量) 數量 from tb where incoming = a.incoming and ppname = a.ppname and name = a.name) b
[解决办法]
是不是想要这个结果啊?
select a.incoming,a.ppname,a.pname,a.name,a.qty,round(a.qty/b.qty,4) as 百分比from table a,(select incoming,ppname,pname,SUM(qty) qty from table group by incoming,ppname,pname) bwhere a.incoming=b.incoming and a.ppname=b.ppname and a.pname=b.pname
[解决办法]
if object_id('[tb]') is not null drop table [tb]gocreate table [tb]([incoming] varchar(8),[ppname] varchar(4),[pname] varchar(4),[name] varchar(10),[数量] int)insert [tb]select '电话销售','售后','产品','使用方法',20 union allselect '电话销售','售后','产品','效果',18 union allselect '电话销售','售后','产品','营养健康',5 union allselect '电话销售','售后','服务','其他',5 union allselect '电话销售','售后','媒体','广告',1 union allselect '电话销售','售后','媒体','赞助',1 union allselect '电话销售','售后','政策','其他',21 union allselect '电话销售','售后','政策','退换货政策',2 union allselect '电话销售','售后','政策','退款政策',1 union allselect '电话销售','售后','政策','物流政策',42 union allselect '电话销售','售前','产品','包装',19go;with cte1 as(select rn=row_number() over(order by getdate()),* from tb),cte2 as(select gid=rn-(select count(1) from cte1 where pname=t.pname and rn<t.rn),*from cte1 t)select a.incoming,a.ppname,a.pname,a.name,a.数量,百分比=ltrim(cast(a.数量*100.0/b.数量 as dec(18,2)))+'%' from cte2 ajoin (select gid,sum(数量) as 数量 from cte2 group by gid) b on a.gid=b.gid/**incoming ppname pname name 数量 百分比-------- ------ ----- ---------- ----------- ------------------------------------------电话销售 售后 产品 使用方法 20 46.51%电话销售 售后 产品 效果 18 41.86%电话销售 售后 产品 营养健康 5 11.63%电话销售 售后 服务 其他 5 100.00%电话销售 售后 媒体 广告 1 50.00%电话销售 售后 媒体 赞助 1 50.00%电话销售 售后 政策 其他 21 31.82%电话销售 售后 政策 退换货政策 2 3.03%电话销售 售后 政策 退款政策 1 1.52%电话销售 售后 政策 物流政策 42 63.64%电话销售 售前 产品 包装 19 100.00%(11 行受影响)**/
[解决办法]
select a.incoming,a.ppname,a.pname,a.name,a.amount,a.amount * 1.0 / b.amount as '百分比'from #t a left join (select incoming, ppname,pname,sum(amount) amount from #t group by incoming, ppname,pname) bon a.incoming = b.incomingand a.ppname = b.ppnameand a.pname = b.pname
------解决方案--------------------
CREATE TABLE TAB1 (incoming VARCHAR(100),ppname VARCHAR(100),pname VARCHAR(100),name VARCHAR(100),NUM INT )INSERT INTO TAB1select '电话销售','售后','产品','使用方法',20Union all select '电话销售','售后','产品','效果',18 Union all select '电话销售','售后','产品','营养健康',5 Union all select '电话销售','售后','服务','其他',5 Union all select '电话销售','售后','媒体','广告',1 Union all select '电话销售','售后','媒体','赞助',1 Union all select '电话销售','售后','政策','其他',21 Union all select '电话销售','售后','政策','退换货政策',2 Union all select '电话销售','售后','政策','退款政策', 1 Union all select '电话销售','售后','政策','物流政策', 42 Union all select '电话销售','售前','产品','包装',19 select * from TAB1select T1.incoming,T1.ppname,T1.pname,T1.name,T1.NUM ,CAST(T1.NUM*100.00 / T2.NUM AS NUMERIC(18)) AS [百分比]from TAB1 T1LEFT JOIN ( SELECT incoming,ppname,pname,SUM(NUM) AS NUM FROM TAB1 GROUP BY incoming,ppname,pname) T2 ON T1.incoming=T2.incoming AND T1.ppname=T2.ppname AND T1.pname=T2.pnamedrop table tab1
[解决办法]
------------------------------ Author :fredrickhu(小F,向高手学习)-- Date :2012-07-18 15:12:41-- Version:-- Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (Intel X86) -- Apr 22 2011 11:57:00 -- Copyright (c) Microsoft Corporation-- Enterprise Edition on Windows NT 6.1 <X64> (Build 7600: ) (WOW64)--------------------------------> 测试数据:[tb]if object_id('[tb]') is not null drop table [tb]go create table [tb]([incoming] varchar(8),[ppname] varchar(4),[pname] varchar(4),[name] varchar(10),[数量] int)insert [tb]select '电话销售','售后','产品','使用方法',20 union allselect '电话销售','售后','产品','效果',18 union allselect '电话销售','售后','产品','营养健康',5 union allselect '电话销售','售后','服务','其他',5 union allselect '电话销售','售后','媒体','广告',1 union allselect '电话销售','售后','媒体','赞助',1 union allselect '电话销售','售后','政策','其他',21 union allselect '电话销售','售后','政策','退换货政策',2 union allselect '电话销售','售后','政策','退款政策',1 union allselect '电话销售','售后','政策','物流政策',42 union allselect '电话销售','售前','产品','包装',19--------------开始查询--------------------------select *, ltrim(cast(数量*100.0/(select sum(数量) from tb where pname=t.pname and incoming=t.incoming and ppname=t.ppname) as dec(18,0)))+'%'from tb t----------------结果----------------------------/* (11 行受影响)incoming ppname pname name 数量 -------- ------ ----- ---------- ----------- ------------------------------------------电话销售 售后 产品 使用方法 20 47%电话销售 售后 产品 效果 18 42%电话销售 售后 产品 营养健康 5 12%电话销售 售后 服务 其他 5 100%电话销售 售后 媒体 广告 1 50%电话销售 售后 媒体 赞助 1 50%电话销售 售后 政策 其他 21 32%电话销售 售后 政策 退换货政策 2 3%电话销售 售后 政策 退款政策 1 2%电话销售 售后 政策 物流政策 42 64%电话销售 售前 产品 包装 19 100%(11 行受影响)*/
[解决办法]
select T1.incoming,T1.ppname,T1.pname,T1.name,T1.NUM ,CAST(T1.NUM*100.00 / T2.NUM AS NUMERIC(18)) AS [百分比]from TAB1 T1LEFT JOIN ( SELECT incoming,ppname,pname,SUM(NUM) AS NUM FROM TAB1 GROUP BY incoming,ppname,pname) T2 ON T1.incoming=T2.incoming AND T1.ppname=T2.ppname AND T1.pname=T2.pname
[解决办法]
--这是表结构:--incoming ppname pname name 数量 --电话销售 售后 产品 使用方法 20 --电话销售 售后 产品 效果 18 --电话销售 售后 产品 营养健康 5 --电话销售 售后 服务 其他 5 --电话销售 售后 媒体 广告 1 --电话销售 售后 媒体 赞助 1 --电话销售 售后 政策 其他 21 --电话销售 售后 政策 退换货政策 2 --电话销售 售后 政策 退款政策 1 --电话销售 售后 政策 物流政策 42 --电话销售 售前 产品 包装 19 create table tb(incoming varchar(10), ppname varchar(10),pname varchar(10),name varchar(10),数量 int)insert into tb values('电话销售' ,'售后' ,'产品', '使用方法', 20 )insert into tb values('电话销售', '售后', '产品', '效果', 18 ) insert into tb values('电话销售', '售后', '产品', '营养健康' ,5 ) insert into tb values('电话销售' ,'售后', '服务', '其他' ,5 ) insert into tb values('电话销售', '售后', '媒体', '广告' ,1 )insert into tb values('电话销售', '售后', '媒体', '赞助' ,1 )insert into tb values('电话销售', '售后', '政策', '其他' ,21 )insert into tb values('电话销售', '售后', '政策', '退换货政策' ,2 )insert into tb values('电话销售' ,'售后' ,'政策', '退款政策', 1 )insert into tb values('电话销售', '售后' ,'政策', '物流政策', 42 )insert into tb values('电话销售', '售前' ,'产品', '包装' ,19 )这是我想的到数据 不用百分比显示也可以 如47% 显示: 0.46511--incoming ppname pname name 数量 百分比--电话销售 售后 产品 使用方法 20 47%--电话销售 售后 产品 效果 18 42% --电话销售 售后 产品 营养健康 5 12%--电话销售 售后 服务 其他 5 100%--电话销售 售后 媒体 广告 1 50%--电话销售 售后 媒体 赞助 1 50%--电话销售 售后 政策 其他 21 32%--电话销售 售后 政策 退换货政策 2 2%--电话销售 售后 政策 退款政策 1 3% --电话销售 售后 政策 物流政策 42 64%--电话销售 售前 产品 包装 19 100% select b.incoming,b.ppname,b.pname ,b.name,b.数量,cast ((b.数量)*100/[sum] as dec(10,2)) from ((select ppname,pname, SUM(数量)as [sum] from tb group by ppname,pname)a join tb b on a.ppname=b.ppname and a.pname=b.pname) incoming ppname pname name 数量 ---------- ---------- ---------- ---------- ----------- ---------------------------------------电话销售 售后 产品 使用方法 20 46.00电话销售 售后 产品 效果 18 41.00电话销售 售后 产品 营养健康 5 11.00电话销售 售后 服务 其他 5 100.00电话销售 售后 媒体 广告 1 50.00电话销售 售后 媒体 赞助 1 50.00电话销售 售后 政策 其他 21 31.00电话销售 售后 政策 退换货政策 2 3.00电话销售 售后 政策 退款政策 1 1.00电话销售 售后 政策 物流政策 42 63.00电话销售 售前 产品 包装 19 100.00(11 行受影响)
[解决办法]
不会吧,咱改一点也行呀
select a.incoming, a.ppname, a.pname, a.name, a.数量, 百分比=ltrim(cast(a.数量*100.0/b.数量 as dec(18,2)))+'%' from tb ajoin (select incoming,ppname,pname,sum(数量) as 数量 from tb group by incoming,ppname,pname) b on a.incoming=b.incoming and a.ppname=b.ppname and a.pname=b.pname