2016-11-02 10 views
0

テーブルから値を取得しようとしています。複数の列をバイヤー名と姓で返します。同じIDを持つ複数の行がある行にあるが、別の列の各一意の値にある値を返すTSQLクエリ

例えば 私は、次のデータ

を持つテーブルがあります|購入ID |ファーストネーム|姓
| --------- 1 ------- | ----ジョー------ | ---スミス---- |
| --------- 1 ------- | -----ピーター--- | ---パン------ |
| --------- 2 ------- | ----最大------ | ---電源---- |
| --------- 2 ------- | -----ジャック---- | ---フロスト---- |私はそう

のような値を返すクエリを記述しようとしている

|購入ID | Buyer1FirstName | Buyer1LastName | Buyer2FirstName | Buyer2LastName |
| -------- 1 --------- | ---- Joe --------- | ---- ----スミス---------- | ---------ピーター----------- | --------パン--- --------- |
| -------- 2 --------- | ------------- Max -------- | ----- ----電源-------- | --------- Jack ----------- | --------- Frost ---- ------ |

私はオンラインで見てきましたが、私がしたいことを言葉で説明する方法がわからないので、私は多くの運を持っていません。誰かが私に正しい方向を向ける視覚的な説明を望んでいます。

ご協力いただければ幸いです。

+0

ですか?対応する製品の購入者数に応じて、各行ごとに異なる数の列が必要ですか?なぜあなたはデータベースでこれをしたいのですか? – HABO

+0

バイヤーの最大数は4となります。購入者が4人未満の行については、その列はnullになります。目的は、結果が1対1である必要のある差し込み/書類のマージのためのデータソースを作成することです。各行は、決済伝票などに挿入するために使用できる購入レコードです。残りのコンテンツの表示私が問題を抱えている唯一のバイヤー名。 – recycledplastyk

+0

決済伝票を書式設定する目的でこれを行うので、文書を生成するアプリケーションコードでこれを処理することが適切です。この種の書式設定は、原則として、データベースではなくアプリケーションでの処理が優れています。 – HABO

答えて

0

あなたは以下のようにROW_NUMBERを使用することができます。

DECLARE @Tbl TABLE (PurchaseID INT, FirstName VARCHAR(50), LastName VARCHAR(50)) 
INSERT INTO @Tbl   
VALUES 
(1, 'Joe', 'Smith'), 
(1, 'Peter', 'Pan'), 
(2, 'Max', 'Power'), 
(2, 'Jack', 'Frost'), 
(2, 'Opss', 'Sspo') 


;WITH CTE 
AS 
(
    SELECT 
     *, ROW_NUMBER() OVER (PARTITION BY PurchaseID ORDER BY PurchaseID) RowId 
    FROM @Tbl 
) 

SELECT 
    A.PurchaseID, 
    MIN(CASE WHEN A.RowId = 1 THEN A.FirstName END) Buyer1FirstName, 
    MIN(CASE WHEN A.RowId = 1 THEN A.LastName END) Buyer1LastName , 
    MIN(CASE WHEN A.RowId = 2 THEN A.FirstName END) Buyer2FirstName , 
    MIN(CASE WHEN A.RowId = 2 THEN A.LastName END)Buyer2LastName, 
    MIN(CASE WHEN A.RowId = 3 THEN A.FirstName END) Buyer3FirstName , 
    MIN(CASE WHEN A.RowId = 3 THEN A.LastName END)Buyer3LastName, 
    MIN(CASE WHEN A.RowId = 4 THEN A.FirstName END) Buyer4FirstName , 
    MIN(CASE WHEN A.RowId = 4 THEN A.LastName END)Buyer4LastName 
FROM 
    CTE A 
GROUP BY 
    A.PurchaseID  

結果:あなたは完全に予測不可能な生産する列の数は

PurchaseID Buyer1FirstName  Buyer1LastName  Buyer2FirstName  Buyer2LastName  Buyer3FirstName  Buyer3LastName Buyer4FirstName  Buyer4LastName 
----------- ------------------- -------------------- -------------------- ------------------ ------------------- ----------------- ------------------- -------------- 
1   Joe     Smith    Peter    Pan    NULL    NULL    NULL    NULL 
2   Max     Power    Jack     Frost    Opss    Sspo    NULL    NULL 
+1

ありがとうNEER!それはまさに私が必要としていたものです。とても有難い。 – recycledplastyk

関連する問題