0

私のSQLは非常に基本的なものなので、あなたが私を助けてくれることを望んでいました. 以下は私のクエリです:

次のようなデータがあります。

Policy Number | Commission Amount | Relationship | PersonLinked
50422         | 1000.00           | Owner        | John Smith
50422         | 1000.00           | Advisor      | Richard Bass
50422         | 1000.00           | Port Man     | Craig Thomson
74857         | 500.00            | Owner        | Karen Jones
98765         | 20000.00          | Owner        | Tim Crosby
98765         | 20000.00          | Port Man     | Josh Bishop

しかし、すべてのデータを 1 行に表示したいので、次のようになります。

Policy Number | Commission Amount | Owner          | Advisor        | Port Man
50422         | 1000.00           | John Smith     | Richard Bass   | Craig Thomson
74857         | 500.00            | Karen Jones    |                |
98765         | 20000.00          | Tim Crosby     |                | Josh Bishop

この方法でデータを操作できる場合は、SQL を教えてください。私は本当に立ち往生しています。助けてください。

4

4 に答える 4

0

最初から知られている固定された静的な数の関係がない限り、答えは「いいえ」です。可変数の列を返す SQL クエリを作成することはできません。

あなたの可能性は次のとおりです: - 独自の SQL rdbms を使用している場合、いくつかのピボット機能がある可能性があります - 任意の種類の言語 (PHP、VBA など) を使用してクエリを作成している場合 - その後、動的に作成できます。可能な関係を照会します。

于 2013-02-20T13:21:15.790 に答える
0

これは、ポリシー番号ごとに各役割が 1 つあり、表示する必要がある役割はこれら 3 つだけであると想定しています。

Select [own].[Policy Number], 
       [own].[Commission Amount],
       [own].[PersonLinked] as [Owner],
       [adv].[PersonLinked] as [Advisor],
       [port].[PersonLinked] as [Port Man]
From   PolicyRoles as [own]
Join   PolicyRoles as [adv] on [own].[Policy Number] = [adv].[Policy Number]
                            and [adv].[Relationship] = 'Advisor'
Join   PolicyRoles as [port] on [own].[Policy Number] = [port].[Policy Number]
                             and [port].[Relationship] = 'Port Man'
Where  [own].[Relationship] = 'Owner'
于 2013-02-20T13:23:15.970 に答える
0

このクエリを試してください

Select a.Policy Number, a.Commission Amount, a.PersonLinked as 'Owner', b.PersonLinked 'Advisor', c.PersonLinked as 'Port Man' 
FROM tbl a, tbl b, tbl c
WHERE a.Policy Number = b.Policy Number AND a.Policy Number = c.Policy Number AND
b.Policy Number = c.Policy Number AND a.Relationship = 'Owner' AND 
b.Relationship = 'Advisor' AND c.Relationship = 'Port Man';
于 2013-02-20T13:24:05.360 に答える
0

まず、答えは、指定しなかった SQL のバージョンによって異なります。すべてのバージョンには、連結を可能にする関数があります。たとえば、テーブル データを文字列に変換します。Oracle - LISTAGG()、MY SQL - GROUP_CONCAT() など... ケースごとにビューまたはテーブルを作成しない限り、SQL で動的列を作成することはできません。必要なすべての列を選択してテーブルを作成し、your_table からさらに列を追加できます。また、列数が異なるビューを作成することもできます。SQL のバージョンでこれを調査する必要があります。CASE 式を使用したこれらの例はすべて優れていますが、CASE ではなく LISTAGG() または GROUP_CONCAT() が実際に探しているものであるため、SQL のバージョンで何が利用できるかを調査して確認します。「動的」列を作成するOracleの例を次に示します。

CREATE TABLE test_tab AS
 SELECT empno
      , ename
      , ename "OWNER" -- This column name is OWNER and datatype is the same as ename 
  FROM scott.emp
 WHERE 1=2 -- False - empty table is created, no data...
/

-- Describe newly created table:

SQL> desc test_tab  

Column Name  Data Type 
--------------------------------
EMPNO    NUMBER (4)              
ENAME    VARCHAR2 (10 Byte)        
OWNER    VARCHAR2 (10 Byte) 
于 2013-02-20T13:38:30.627 に答える