0

对于以下问题,我有一种蛮力的解决方案,但我相信这里有人会有一个优雅的解决方案。

我有以下水平方向的表格。

| Person  | Trait1 | Trait2 |
| Patrick | .3     | .4     |
| James   | .7     | .3     |
| Kristin | .9     | .2     |

理想情况下,我希望根据特征将上述内容分成两个垂直表。将有两个垂直表,Bad 和 Terrible。

如果 .4 <= Trait1 < .6 -> 不好,Trait1 >= .7 -> 很糟糕

如果 .3 <= Trait2 < .5 -> 不好,Trait2 >= .9 -> 很糟糕

使用这些条件,我们将得到下表

BAD
|Person   | Trait  | Value |
| Patrick | Trait2 | .4    | 
| James   | Trait2 | .3    |

Terrible
|Person  | Trait  | Value |
|James   | Trait1 | .7    | 
|Kristin | Trait1 | .9    |
4

1 回答 1

3

由于您使用的是 SQL Server 2005,因此可以使用 UNPIVOT 函数来获取结果。

UNPIVOT 获取列并将其转换为行,这将更容易应用您的过滤器。

坏数据:

select person, trait, value
into bad
from yourtable
unpivot
(
  value
  for trait in (trait1, trait2)
) u
where 
(
  trait ='trait1'
  and value >= .4
  and value < .6
)
or
(
  trait ='trait2'
  and value >= .3
  and value < .5
);

可怕的数据:

select person, trait, value
into terrible
from yourtable
unpivot
(
  value
  for trait in (trait1, trait2)
) u
where 
(
  trait ='trait1'
  and value >= .7
)
or
(
  trait ='trait2'
  and value >= .9
);

请参阅SQL Fiddle with Demo

请注意,这也可以使用 UNION ALL 查询将列 UNPIVOT 到行中来完成:

select person, trait, value
from
(
  select person, 'trait1' trait, trait1 value
  from yourtable
  union all
  select person, 'trait2' trait, trait2 value
  from yourtable
) d
-- where apply the filter here. 

UNPIVOT 和 UNION ALL 将数据转换为以下格式垂直格式:

|  PERSON |  TRAIT | VALUE |
----------------------------
| Patrick | trait1 |   0.3 |
|   James | trait1 |   0.7 |
| Kristin | trait1 |   0.9 |
于 2013-04-24T17:13:17.747 回答