0

私が持っている:
items一連の ID (GroupType、ID、Name) によって記述されます

VALUES各日付の因子値が取り込まれるテーブルで、アイテムが日付ごとの値を持つ特定の因子セットのみを取得するようにします。

FACTORS要因の静的な説明を含むテーブル。


探しているもの:

日付ごとの各項目の因子値を示すマトリックスを含む一時テーブルを作成して、特定の日付にどの因子が入力されたかをユーザーフレンドリーな方法で (対応する値とともに) 確認できるようにしたいと考えています。

Date        GroupType   ID  Name   FactorId  Value
01/01/2013        1     1   A      1         10
01/01/2013        1     1   A      2         8
01/01/2013        1     1   A      3         12

01/01/2013        1     2   B      3         5
01/01/2013        1     2   B      4         6

02/01/2013        1     1   A      1         7
02/01/2013        1     1   A      2         6

02/01/2013        1     2   B      3         9
02/01/2013        1     2   B      4         9

要因

FactorId FactorName 
1     Factor1
2     Factor2
3     Factor3
4     Factor4
.     .
.     .
.     .

一時テーブルの因子値マトリックス

Date          Group       ID     Name  Factor1    Factor2      Factor3     Factor4  Factor...
01/01/2013        1        1        A       10          8           12
01/01/2013        1        2        B                                5           6

02/01/2013        1        1        A        7          6           
02/01/2013        1        2        B                                9           9

どんな助けでも大歓迎です!

4

2 に答える 2

2

このタイプのデータ変換はPIVOT、行から値を取得して列に変換する として知られています。

SQL Server 2005 以降では、このデータのローテーションを実行する関数があります。

静的ピボット:

値が設定される場合はFactorNames、静的ピボットを使用して列にハードコーディングできます。

select date, grouptype, id, name, Factor1, Factor2, Factor3, Factor4
from
(
  select v.date,
    v.grouptype,
    v.id,
    v.name,
    f.factorname,
    v.value
  from [values] v
  left join factors f 
    on v.factorid = f.factorid
  -- where v.date between date1 and date2
) src
pivot
(
  max(value)
  for factorname in (Factor1, Factor2, Factor3, Factor4)
) piv;

SQL Fiddle with Demoを参照してください。

動的ピボット:

あなたの場合、不明な数の値を持つことになると述べました。その場合、動的 SQL を使用して、実行時に実行される SQL 文字列を生成する必要があります。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(FactorName) 
                    from factors
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT date, grouptype, id, name,' + @cols + ' from 
             (
                select v.date,
                  v.grouptype,
                  v.id,
                  v.name,
                  f.factorname,
                  v.value
                from [values] v
                left join factors f 
                  on v.factorid = f.factorid
                -- where v.date between date1 and date2
            ) x
            pivot 
            (
                max(value)
                for factorname in (' + @cols + ')
            ) p '

execute(@query)

SQL Fiddle with Demoを参照してください。

これらのバージョンはどちらも同じ結果を生成します。

|       DATE | GROUPTYPE | ID | NAME | FACTOR1 | FACTOR2 | FACTOR3 | FACTOR4 |
------------------------------------------------------------------------------
| 2013-01-01 |         1 |  1 |    A |      10 |       8 |      12 |  (null) |
| 2013-01-01 |         1 |  2 |    B |  (null) |  (null) |       5 |       6 |
| 2013-02-01 |         1 |  1 |    A |       7 |       6 |      11 |  (null) |
| 2013-02-01 |         1 |  1 |    B |  (null) |  (null) |       9 |       9 |

日付範囲に基づいて結果をフィルタリングする場合はWHERE、上記のクエリに句を追加するだけです。

于 2013-02-04T10:40:28.643 に答える
0

行を列にピボットしようとしているだけのようです。これはあなたが望むことだと思います:

select Date, Group, ID, Name, 
       max(case when factorid = 1 then name end) as Factor1,
       max(case when factorid = 2 then name end) as Factor2,
       max(case when factorid = 3 then name end) as Factor3,
       max(case when factorid = 4 then name end) as Factor4
from t
group by Date, Group, ID, Name
于 2013-02-04T03:24:10.553 に答える