5

このテーブルには、ID 列、valueHeading 列、および値列が含まれています。値列を、値が持つ valueHeading のタイプに応じて、valueHeading1 と valueHeading2 という 2 つの新しい列に分けたいと考えています。

だから私はこの選択に参加したい: 編集: 完全な参加

SELECT ID
      ,valueHeading
      ,value as 'valueHeading1'
FROM table1
WHERE valueHeading = 'valueHeading1'

これを選択すると:

SELECT ID
      ,value as 'valueHeading2'
FROM table1
WHERE valueHeading = 'valueHeading2'

それぞれのIDで。どうすればいいですか?

私がやりたいことを説明するために編集します。

元のテーブル:

ID    valueHeading    value
0     valueHeading1    a
0     valueHeading2    a
1     valueHeading1    ab
1     valueHeading2    NULL
2     valueHeading1    abcd
2     valueHeading2    abc

新しいテーブル:

ID    valueHeading1    valueHeading2
0          a               a
1          ab              NULL
2         abcd             abc
4

4 に答える 4

6

参加するだけでよい場合は、これを使用してください。参加する必要がない場合は、casewhenを使用するのがエレガントな方法です。

SELECT * FROM 
    (SELECT ID
          ,valueHeading
          ,value as 'valueHeading1'
    FROM table1
    WHERE valueHeading = 'valueHeading1') AS TAB_1, 
    (SELECT ID
          ,value as 'valueHeading2'
    FROM table1
    WHERE valueHeading = 'valueHeading2') AS TAB_2
    WHERE TAB_1.ID = TAB_2.ID
于 2013-02-01T14:28:09.847 に答える
5

次のようなものを試してください:

SELECT ID
      , CASE WHEN valueHeading = 'valueHeading1' THEN value ELSE NULL END AS valueHeading1
      , CASE WHEN valueHeading = 'valueHeading2' THEN value ELSE NULL END AS valueHeading2
FROM table1
WHERE valueHeading IN ('valueHeading1', 'valueHeading2')

IDごとに1行のすべての値を再グループ化したい場合は、次を試すことができます:

SELECT ID
      , MAX(CASE WHEN valueHeading = 'valueHeading1' THEN value ELSE NULL END) AS valueHeading1
      , MAX(CASE WHEN valueHeading = 'valueHeading2' THEN value ELSE NULL END) AS valueHeading2
FROM table1
WHERE valueHeading IN ('valueHeading1', 'valueHeading2')
GROUP BY ID
HAVING MAX(CASE WHEN valueHeading = 'valueHeading1' THEN value ELSE NULL END) IS NOT NULL
OR MAX(CASE WHEN valueHeading = 'valueHeading2' THEN value ELSE NULL END) IS NOT NULL

SQLFiddleを参照してください。Oracle 11g と MSSQL 2012 も試しましたが、毎回動作します。

于 2013-02-01T14:26:54.070 に答える
3

SQLServer2005+ では PIVOT を使用できます

SELECT ID, valueHeading1, valueHeading2
FROM
(
 SELECT *
 FROM dbo.test28
 WHERE valueHeading IN ('valueHeading1', 'valueHeading2')
 ) x
 PIVOT
 (
  MAX(value)
  FOR valueHeading IN ([valueHeading1], [valueHeading2])
  ) p

SQLFiddle のデモ

于 2013-02-01T15:30:41.840 に答える
0

自己結合は簡単な解決策になる可能性があります

SELECT DISTINCT t1.ID, t1.value as valueHeading1, t2.value as valueHeading2, 
FROM table1 t1
INNER JOIN table1 t2 ON t1.ID = t2.ID
WHERE t1.valueHeading <> t2.valueHeading
于 2016-11-02T06:52:51.053 に答える