0

それで、私はこの問題に対する良い解決策を見つけるために一日中探しましたが、空っぽになりました. 次のようなテーブルがあるとします。

ProjectID Position BilledSoFar NotBilled
---------------------------------------------- ------
EE123 AA1 100 200
EE456 MNGR 4000 500
EE123 AA3 43 0
EE012 SPEC1 435 4355
.... .... .... ....

そして、私がやろうとしているのは、同じ projectID を持つ複数の行を取得し、これらすべての行を 1 つに結合することです。プロジェクト ID ごとに「Position」「BilledSoFar」および「NotBilled」が必要です。ProjectID の Position が存在しない場合でも、次のようになります:

ProjectID
----------------- -------------------------------------------------- ---------------------------------------------
EE123 AA1 100 200 AA3 43 0 MNGR ヌル ヌル ..........

等々。

したがって、特定のプロジェクト ID のすべてのレコードを 1 つの行に配置する必要があり、その projectID のポジションが存在しない場合でも (上記の例は MNGR であり、EE123 の下のポジションではありません)、すべてのポジションを取得する必要があります。請求情報 (プロジェクト ID のポジションが存在しない場合は、明らかに NULL になります)。ピボット、結合、およびユニオンを検討しましたが、まだこれを理解できず、ここで推測が不足しています。

また、固定数のプロジェクト ID (3400 としましょう) と固定数の位置 (この場合は 20 としましょう) があることも知っていることに注意してください。

ありがとう。

4

2 に答える 2

0

再帰 CTE を使用してこれを平坦化できますが、これは値を別々の列に配置せず、代わりにカンマ区切りの 1 つの列に配置します。それがうまくいかない場合:

  • 動的 SQL の非常に複雑な作成を使用して、次のオプションをオンザフライで実行できます (必要な数の列のみが作成されます (20 まで構築する必要がない場合))。
  • 非常に長い左結合をハードコーディングできます。これは、20 行を超えず、これが必要なのは 1 回だけであることがわかっているためです。

次のようになります。

SELECT ProjectID, Position, BilledSoFar, NotBilled, 
    ROW_NUMBER() OVER (PARTITION BY ProjectID ORDER BY Position) AS RowNum
INTO #ProjectTable
FROM ProjectTable

SELECT ProjectTable.ProjectID, 
    ProjectTable.Position AS Position1, ProjectTable.BilledSoFar AS BilledSoFar1, 
    ProjectTable.NotBilled AS NotBilled1, 
    ProjectTable2.Position AS Position2, ProjectTable2.BilledSoFar AS BilledSoFar2, 
    ProjectTable2.NotBilled AS NotBilled2, 
    ...
    ProjectTable20.Position AS Position20, ProjectTable20.BilledSoFar AS BilledSoFar20, 
    ProjectTable20.NotBilled AS NotBilled20 
FROM #ProjectTable AS ProjectTable
    LEFT JOIN #ProjectTable AS ProjectTable2
        ON ProjectTable.ProjectID = ProjectTable2.ProjectID AND ProjectTable2.RowNum = 2
    ...
    LEFT JOIN #ProjectTable AS ProjectTable20
        ON ProjectTable.ProjectID = ProjectTable20.ProjectID AND ProjectTable20.RowNum = 20
WHERE ProjectTable.RowNum = 1
  • 示唆されているように、これはクライアント アプリケーションで実行する必要がありますが、一度だけ実行する場合は、上記の簡単なコピー アンド ペースト方法を使用します。
于 2012-05-03T03:53:04.533 に答える
0

目的の projectID を引数として受け入れるプロシージャを作成できます。

CURSOR ( http://justgeeks.blogspot.com/2008/08/using-t-sql-cursor-in-sql-server.html ) を使用して、projectID に一致する行をループし、フィールドの区切られた文字列を作成します。 .

文字列を返すか、文字列から選択ステートメントを作成して実行します。

たとえば、実行する選択文字列は CURSOR から構築されます。

SELECT 'EE123' AS 'ProjectID',
       'AA1', 
       '100', 
       '200', 
       'AA3', 
       '43', 
       '0', 
       'MNGR', 
       'Null', 
       'Null' 
FROM <tablaname> 
WHERE 1=1
于 2012-05-03T04:19:43.037 に答える