1

TableAとTableBの2つのテーブルがあります

TableA:columnBLA、objName、objID

TableB:objID、ColumnIndex、StringValue、NumberValue、DateValue

TableA has a row: bla, Object Name, 21

TableB also has data for objID=21:

21, 1, a, NULL, NULL
21, 1, b, NULL, NULL
21, 1, c, NULL, NULL
21, 2, NULL, 11, NULL
21, 2, NULL, 22, NULL
21, 2, NULL, 33, NULL
21, 3, NULL, NULL, 1/1/2012
21, 3, NULL, NULL, 1/1/2013
21, 3, NULL, NULL, 1/1/2014

次に、このデータを次の形式に再形成します。

a, 11, 1/1/2012
b, 22, 1/1/2013
c, 33, 1/1/2014

私はこれまでに持っています:

Select StringValue, NumberValue, DateValue
From
(Select StringValue
From TableA ta WITH (NOLOCK), TableB tb WITH (NOLOCK)
WHERE ta.objID = tb.objID
AND t.objName = N'Object Name'
AND d.ColumnIndex = 1) As StringValues
,
(Select NumberValue
From TableA ta WITH (NOLOCK), TableB tb WITH (NOLOCK)
WHERE ta.objID = tb.objID
AND t.objName = N'Object Name'
AND d.ColumnIndex = 2) As NumberValues
,
(Select DateValue
From TableA ta WITH (NOLOCK), TableB tb WITH (NOLOCK)
WHERE ta.objID = tb.objID
AND t.objName = N'Object Name'
AND d.ColumnIndex = 1) As DateValues

しかし、私は望ましくない結果を得ました。そのためにPIVOTを使用する必要があると誰かに言われましたが、私のSQLの知識はそれほど広がりません。

4

2 に答える 2

1

UNPIVOTanとPIVOT:の両方を使用してこれを行う1つの方法を次に示します。

select objid, stringvalue, numbervalue, datevalue
from
(
  select objid, col, value,
    row_number() over(partition by objid, col order by value) rn
  from
  (
    select a.objid,
      b.stringvalue,
      b.numbervalue,
      b.datevalue
    from tablea a
    left join tableb b
      on a.objid = b.objid
  ) src
  unpivot
  (
    value
    for col in (stringvalue, numbervalue, datevalue)
  ) unpiv
) s
pivot
(
  max(value)
  for col in (stringvalue, numbervalue, datevalue)
) piv

SQL FiddlewithDemoを参照してください。unpivotは、個別の列から値を取得し、それを行に変換します。row_number()次に、データにaを適用してから、ピボットを適用してデータを列に戻します。

PIVOTand関数を使用せずにこれを行う別の方法UNPIVOTは、を適用してから、式row_number()で集計関数を使用することです。CASE

select objid,
  max(case when columnindex = 1 then stringvalue end) stringvalue,
  max(case when columnindex = 2 then numbervalue end) numbervalue,
  max(case when columnindex = 3 then datevalue end) datevalue
from
(
  select a.objid,
    b.stringvalue,
    b.numbervalue,
    b.datevalue,
    b.columnindex,
    row_number() over(partition by a.objid, b.columnindex 
                      order by b.columnindex) rn
  from tablea a
  left join tableb b
    on a.objid = b.objid
) src
group by objid, rn

SQL FiddlewithDemoを参照してください

両方のクエリの結果は次のとおりです。

| OBJID | STRINGVALUE | NUMBERVALUE | DATEVALUE |
-------------------------------------------------
|    21 |           a |          11 |  1/1/2012 |
|    21 |           b |          22 |  1/1/2013 |
|    21 |           c |          33 |  1/1/2014 |
于 2013-02-05T11:43:28.647 に答える
0

およびを使用CTErow_number()ます。フィドルデモ

;with cte as (
  select row_number() over (partition by columnIndex 
                            order by StringValue, NumberValue, DateValue) rn,
  StringValue, NumberValue, DateValue
  from tableB tb join tableA ta on tb.objId = ta.objid
)
select t1.StringValue, t2.NumberValue, t3.DateValue
from cte t1 join cte t2 on t1.rn = t2.rn 
            join cte t3 on t1.rn = t3.rn 
where not (t1.stringValue is null or t2.numberValue is null or t3.datevalue is null)
order by t1.stringValue
于 2013-02-05T13:33:45.220 に答える