2012-12-28 42 views
1

我对在不同地区销售的钻石宝石有以下信息。更好的书写脚本方式

TEMP1

Region Cut Color SoldQty 
------- -- ----- ------- 
01  RD C  1 
01  RD A  1 
01  RD C  3 
01  BA C  2 
02  RD A  2 
02  BA A  3 
02  BA B  0 
02  BA A  1 

从上面的,我需要在SQL Server 2005中的以下信息基本上为RegionCutColor一个独特的组合,我需要Sold Qty总结和为每个地区计算的销售百分比。

最终输出需要

Region Cut Color SoldQty TotalSOld %SOld 
------- -- ----- ------- --------- ----- 
01  RD C  1  4   4/7 
01  RD A  1  1   1/7 
01  BA C  2  2   2/7 
02  RD A  2  2   2/6 
02  BA A  4  4   4/6 
02  BA B  0  0   0 

为了实现这一点,我使用2-3临时表 - 如下。

select 
    Region, Cut, Color, 
    sum(SoldQty), 
    'TotalSoldQty' = Sum (SoldQty) OVER(PARTITION BY Region) 
into temp2 
from temp1 
group by Region, Cut, Color 

这会给表格temp2如下。

Region Cut Color SoldQty TotalSOld 
------- -- ----- ------- --------- 
01  RD C  1  4   
01  RD A  1  1   
01  BA C  2  2   
02  RD A  2  2   
02  BA A  4  4   
02  BA B  0  0   

然后我又添加了一个select来获得最终表。上述

select 
    Region, Cut, Color,SoldQty, TotalSOld, 
    'PercentageSoldQty' = case when TotalSold = 0 then 0 
           else (SoldQty *100/TotalSold) end 
from temp2 

该给我的结果,但我相信,必须有一个更好的方式来在一个单一的选择做到这一点比使用多个临时表。

任何人都可以帮忙吗?

回答

0

这是一个主键(或我相信他们是已知的候选键)派上用场的实例。如果您修改您的结构:

Region Cut Color SoldQty 

ID Region Cut Color SoldQty 

您现在可以通过ID查找。这也给了你这样做的能力:

select Region,Cut,Color, sum(SoldQty), 
'TotalSoldQty' = Sum (SoldQty) OVER(PARTITION BY Region) 

而不产生任何临时表。

1

如何结束SoldQty和TotalSold在第1行中的区别?这对我来说似乎是一个错误。这个怎么样:

http://www.sqlfiddle.com/#!6/0f5fe/24

select region,cut,color, soldqty, cast(soldqty as varchar) +'/' + cast(regiontotal as varchar) PercentSold FROM (
    select region,cut,color, sum(soldqty) soldqty, regiontotal from (
    select soldqty, region,cut,color,sum(soldqty) over (partition by region) as regiontotal 
    from sale 
) b 
    group by region,cut,color, regiontotal 
)foo