需要简单但复杂的SQL查询

时间:2011-06-27 15:10:50

标签: sql-server-2008

背景

我有一个表(以及它的派生表),但它看起来像这样:我没有读/写权限,但我可以将整个结构复制到临时表。

------------------------------------------------------------------
id |  R_2010 |  R_2009  |   W_2010 |  W_2009 |  M_2010 |   M_2009 |
------------------------------------------------------------------
1      33%       56%         47%       56%       40%        33%
2      N/D       N/D         N/D       N/D       N/D        N/D
3      64 %      77 %        71 %      84 %      49 %       71 %
4      N/D       N/D         N/D       N/D       89%        84%
5      56%       N/D         58%       N/D       62%        N/D
6      100%      0%          100%      50%       100%       50%
7      94%       71%         94%       82%       100%       82%

基本上我想做的是以下内容:

If %_2010 is between 80 - 100 AND there is an increase from 
 %_2009 to %_2010 by 20 percent, i want this row. 


Similary  If %_2010 is between 70 - 80 AND there is an increase from 
 %_2009 to %_2010 by 25 percent, i want this row. 


Similary  If %_2010 is between < 70 AND there is an increase from 
 %_2009 to %_2010 by 30 percent, i want this row. 


* % = R, W, M

实施例

考虑第8行。其R_2010&gt; 80所以我们想要第一条规则。 此外,R_2010 - R_2009 = 20%,所以我们对此感兴趣。

同样在排,W_2010&gt; 80所以我们想要第一条规则 所以W_2010 - W_2009 = 41这个超过20%,所以我也想要这一行。 注意与上面的行相同。

在第8行,M_2010&gt;但是,差异不超过20% 所以我不感兴趣。

所以我想:

------------------------------------------
NEW TEMP TABLE 
------------------------------------------
id, type,  increaseBy
------------------------------------------
8,  R,     20
8,  W,     41

问题

如您所见,所有这些列都是VARCHAR,它们的长度不同(即0%,20%,100%),有些甚至没有百分比({{1} })。有些在数字和'%'之间有一个空格

当前工作..

我正在努力,我将更新这篇文章,因为我有一些不会返回错误

1 个答案:

答案 0 :(得分:0)

我建议首先要修复派生表以摆脱任何非数字字符。取消“N / D”并删除空格和%符号。然后你有你可以做的事情的数字。

您还必须至少三次加入此表,因为您似乎最终需要单独的记录,一个用于R记录,一个用于W记录,一个用于M记录。也许派生表不应该尝试将它们放在一行中。

如果您希望每种类型的结果都在一行上,您可以使用案例陈述来获得所需的结果。