3

次のようなソーステーブルがあります。

ここに画像の説明を入力してください

結果表の作り方はこんな感じ。SQLまたはJavaコードでソリューションを使用できます。

ここに画像の説明を入力してください

どうか、誰か助けてくれませんか。ありがとう。

4

2 に答える 2

10

UNPIVOTこれを行う最も簡単な方法は、とPIVOT関数の両方を適用して結果を取得することだと思います。

select account, description,
  [value_1], [value_2], [value_3], [value_4]
from
(
  select account, description, col, value,
    row_number() over(partition by account, col order by col) rn
  from 
  (
    select [account], [description], [value_1], [value_2], [value_3], [value_4]
    from yourtable
  ) src
  unpivot
  (
    value 
    for col in ([value_1], [value_2], [value_3], [value_4])
  ) un
) s
pivot
(
  max(value)
  for col in ([value_1], [value_2], [value_3], [value_4])
) piv

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

これは、アンピボットとして a を使用し、集計関数と式を使用して行うことUNION ALLできます。CASE

select account, description,
  max(case when col = 'value_1' then value end) value_1,
  max(case when col = 'value_2' then value end) value_2,
  max(case when col = 'value_3' then value end) value_3,
  max(case when col = 'value_4' then value end) value_4
from
(
  select account, description, col, value,
    row_number() over(partition by account, col order by account) rn
  from
  (
    select [account], [description], 'value_1' col, [value_1] value 
    from yourtable
    where [value_1] is not null
    union all
    select [account], [description], 'value_2' col, [value_2] value 
    from yourtable
    where [value_2] is not null
    union all
    select [account], [description], 'value_3' col, [value_3] value 
    from yourtable
    where [value_3] is not null
    union all
    select [account], [description], 'value_4' col, [value_4] value 
    from yourtable
    where [value_4] is not null
  ) s
) un
group by account, description, rn

デモで SQL Fiddle を参照してください

両方とも結果が得られます。

| ACCOUNT |  DESCRIPTION |  VALUE_1 |  VALUE_2 |  VALUE_3 |  VALUE_4 |
----------------------------------------------------------------------
|  A00005 | Account Desc | ABCD0081 | BCDE0010 | BKCP0010 | SMTP0010 |
|  A00005 | Account Desc | ABCD0082 |   (null) | BKCP0011 |   (null) |
于 2013-02-05T19:40:43.607 に答える
0

1 つのアイデアはRow_Number()、結合フィールドとして を使用することです。このようなもの:

SELECT T.Account, T.Description, T1.Value_1, T2.Value_2, T3.Value_3, T4.Value_4
From 
  (
      SELECT Account, Description, Value_1, Value_2, Value_3, Value_4, 
           Row_number() OVER (ORDER BY (SELECT 0)) rn
      FROM YourTable
  ) T
  LEFT JOIN (
        SELECT Account, Value_1, Row_number() OVER (ORDER BY (SELECT 0)) rn
        FROM YourTable
        WHERE Value_1 <> '') T1 ON T.Account = T1.Account AND T.rn = T1.rn
  LEFT JOIN (
        SELECT Account, Value_2, Row_number() OVER (ORDER BY (SELECT 0)) rn
        FROM YourTable 
        WHERE Value_2 <> ''
  ) T2 ON T.Account = T2.Account AND T.rn = T2.rn
  LEFT JOIN (
        SELECT Account, Value_3, Row_number() OVER (ORDER BY (SELECT 0)) rn 
        FROM YourTable 
        WHERE Value_3 <> ''
  ) T3 ON T.Account = T3.Account AND T.rn = T3.rn
  LEFT JOIN (
        SELECT Account, Value_4, Row_number() OVER (ORDER BY (SELECT 0)) rn 
        FROM YourTable 
        WHERE Value_4 <> ''
  ) T4 ON T.Account = T4.Account AND T.rn = T4.rn
WHERE T1.Value_1 IS NOT NULL 
  OR T2.VALUE_2 IS NOT NULL 
  OR T3.VALUE_3 IS NOT NULL 
  OR T4.VALUE_4 IS NOT NULL 

値が空白として保存されている場合、これは機能するはずです。NULL として格納されている場合は、<> '' を IS NOT NULL に置き換えます。

ここにSQL Fiddleがあります。

幸運を。

于 2013-02-05T19:32:56.637 に答える