首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQL着实想不同

2012-08-07 
SQL实在想不同这是表结构:incomingppnamepnamename数量电话销售售后产品使用方法20电话销售售后产品效果18

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%

[解决办法]

SQL code
--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
[解决办法]
是不是想要这个结果啊?
SQL code
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
[解决办法]
SQL code
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 行受影响)**/
[解决办法]
SQL code
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
------解决方案--------------------


SQL code
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
[解决办法]
SQL code
------------------------------ 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 行受影响)*/
[解决办法]
SQL code
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
[解决办法]
SQL code
--这是表结构:--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 行受影响) 


[解决办法]
不会吧,咱改一点也行呀

探讨

SQL code
select T1.incoming,T1.ppname,T1.pname,T1.name,T1.NUM ,CAST(T1.NUM*100.00 / T2.NUM AS NUMERIC(18)) AS [百分比]
from TAB1 T1
LEFT JOIN (
SELECT
incoming,ppname,pname,SUM(NUM) AS NUM
……

[解决办法]
探讨
SQL code
--这是表结构:
--incoming ppname pname name 数量
--电话销售 售后 产品 使用方法 20
--电话销售 售后 产品 效果 18
--电话销售 售后 产品 营养健康 5
--电话销售 售后 服务 其他 5
--电话销售 售后 媒体 广告 1
--电话销售 售后 媒体 赞助 1
--电话销售……

[解决办法]
SQL code
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 

热点排行