0

私は次の問題を解決するための一種のブルートを持っていますが、ここの誰かがエレガントな解決策を持っていると確信しています.

次の横向きのテーブルがあります。

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

理想的には、特性に基づいて上記を 2 つの縦の表に分けたいと思います。Bad と Terrible の 2 つの垂直テーブルがあります。

.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 に答える