0

フィドルの例: http://sqlfiddle.com/#!3/419ec/3

SQL サーバー 2008。

以下の選択クエリで置換機能とアンピボット機能を使用して何が起こっているのかを誰かが説明してくれるかどうか疑問に思っていました。私はSQLの初心者であり、そのタイプのクエリのロジック(テーブルの非正規化)を理解していません。

CREATE TABLE TableB
    ([date] datetime, [Id] int, [name] varchar(3), [blah1] varchar(4), [hour1] int, [hour2] int, [hour3] int, [hour4] int)
;

INSERT INTO TableB
    ([date], [Id], [name], [blah1], [hour1], [hour2], [hour3], [hour4])
VALUES
    ('2013-04-01 00:00:00', 1, 'Jim', 'test', 129, 343, 54, 89),
    ('2013-04-01 00:00:00', 2, 'Bob', 'rewe', 45, 6, 45, 2),
    ('2013-04-02 00:00:00', 3, 'Joe', 'fdf', 7, 8, 4, 3)

クエリを選択:

select date, 
  id, 
  name,
  replace(MightMouse, 'hour', '') hour,
  observationvalue
from tableB
unpivot
(
  observationvalue
  for MightMouse in (hour1, hour2, hour3, hour4)
) unpiv

replace 関数の使い方は次のように考えました。

REPLACE ( string_expression , string_pattern , string_replacement )

string_expression

http://msdn.microsoft.com/en-us/library/ms186862.aspx

関数の定義によるとreplace、string_expression は部分文字列が検索される文字列です (部分文字列は完全な文字列にすることができます)。例えば、

replace('mynameisjohn', 'john', '')

johnこれにより、string_expressionの部分文字列が検索され、mynameisjohn空の文字列に置き換えられ、結果として と等しい文字列が得られますmynameis

しかし、上記の例では、何が何なのかわかりませんMightyMouseMightyMouse元の表にはありません。また、実行の流れのように、アンピボット部分がクエリにどのように収まるかもわかりません。

たとえば、これが python の場合、直感的なコードのロジックへの流れがあります。SQL を使用すると、醜いクエリを作成できるように見えますが、SQL の観点からは問題なく動作します。しかし、ユーザーの観点からは、クエリ コードのさまざまな部分で何が起こっているのかを分解するのは難しい場合があります。

4

3 に答える 3

1

アンピボットは、ケースで指定された各列にネストされた左外部結合を使用します

 (hour1, hour2, hour3, hour4)

これらの列名は、あなたの場合は MightMouse と呼ばれる結果の一部でもあります

select replace('hour1','hour','')
select replace('hour2','hour','')
select replace('hour3','hour','')

つまり、同じクエリを次のように書くことができます

select a.date,a.id, 
  a.name,replace('hour1', 'hour', '') as hour ,a.hour1 as observationvalue
from TableB a
left outer join TableB b
on a.hour1=b.hour1
where a.hour1 is not null
union

select a.date,a.id, 
  a.name,replace('hour2', 'hour', '') as hour ,a.hour2 as observationvalue
from TableB a
left outer join TableB b
on a.hour2=b.hour2
where a.hour2 is not null
union
select a.date,a.id, 
  a.name,replace('hou3', 'hour', '') as hour ,a.hour3 as observationvalue
from TableB a
left outer join TableB b
on a.hour3=b.hour3
where a.hour3 is not null
union
select a.date,a.id, 
  a.name,replace('hour4', 'hour', '') as hour ,a.hour4 as observationvalue
from TableB a
left outer join TableB b
on a.hour4=b.hour4
where a.hour4 is not null
于 2013-04-24T22:01:28.710 に答える
0

「MightMouse」は新しい列の名前です。基本的に、これらの時間列をすべて取り、それらを 1 つの列に押しつぶします。「for MightMouse in ...」は、列 MightMouse を呼び出しています。そのため、その新しい列のリテラル文字列「hour」を空の文字列に置き換えています。

于 2013-04-24T21:10:19.737 に答える