编写脚本的更好方法

时间:2012-12-28 21:21:16

标签: sql-server tsql

我有以下有关各地区销售的钻石的信息。

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的唯一组合,我需要{{1}总结并计算出每个地区的销售额百分比。

需要最终输出

Sold Qty

为了实现这个目的,我使用了2-3个临时表 - 如下所示。

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

这会给表格temp2如下。

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

然后我添加了另一个选择,如下所示进入决赛桌。

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         

上面给出了结果,但我确信,在单个选择中必须有一个更好的方法来实现这个,而不是使用多个临时表。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

你如何在第1排中与SoldQty和TotalSold不同?这对我来说似乎是个错误。怎么样:

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

答案 1 :(得分:0)

这是一个实例,其中主键(或我认为已知的候选键)派上用场。如果您修改结构:

Region Cut Color SoldQty   

ID Region Cut Color SoldQty   

您现在可以按ID查找。这也使你能够做到这一点:

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

没有生成任何临时表。