2017-10-13 3 views
-1

私は下の表の構造を持って来る必要があり、のSQLServerレコードはhorizo​​ntly

表名:カスタマー

Cust_id Cust_Name 
------------------------ 
    101  John 
    102  Peter 

表名:Loan_Details

Id LoanName   Cust_Id Amt 
    ----------------------------------------- 
    1 PersonalLoan 101  2L 
    2 PersonalLoan 101  3L 
    3 HomeLoan  101  10L 

テーブル名:プロダクト

Id Cust_Id  ProductName Cost 
    ----------------------------------------- 
    1  101  Product1  1000 
    2  101  Product1  2000 
    3  101  Product1  3000 

以下の構造で結果が水平になる必要がありますか?

Cust_Id Cust_Name PersonalLoan Amt HomeLoan Amt ProductName Cost 
-------------------------------------------------------------------------------- 
101  John  PersonalLoan 2L HomeLoan 10L Product1  1000 
101  John  PersonalLoan 3L NULL  NULL Product1  2000 
101  John  NULL   NULL NULL  NULL Product1  3000 
+0

は、それらの間の関係に基づいてテーブルを結合して、必要なフィールド – Rams

+0

を選択し、あなたはMS SQL ServerまたはOracle(PL/SQL)を使用していますか?関与していない製品にはタグを付けないでください。 – jarlh

+0

Imを使用しているSQL – Srinivasan

答えて

-1
select * from 
(select c.Cust_id,Cust_Name,ld.LoanName as Loan,Amt,ProductName,Cost 
from Customer c left join Product p on p.Cust_id=c.Cust_id 
left join Loan_Details ld on ld.Cust_id = c.Cust_id) as MTable 
PIVOT 
(
SUM(Amt) for Loan in ([HomeLoan],[PersonalLoan]) 
) as PTable 

使用このそれはあなたが、結果はあなたがこのクエリを試すことができます。この

Cust_id  Cust_Name   ProductName   Cost  HomeLoan PersonalLoan 
----------- -------------------- -------------------- ----------- ----------- ------------ 
101   John     Product1    1000  10   5 
101   John     Product12   2000  10   5 
101   John     Product2    3000  10   5 
102   Peter    NULL     NULL  NULL  NULL 
+1

PersonalLoan 3Lはどこですか?答弁のためだけにはお答えください。 –

1

のようなもので何をしたいあなたを与えるだろう。

「Peter」もリストしたい場合は、CusPrdサブクエリのINNER JOINLEFT JOINに変更してください。

DECLARE @Customer TABLE (Cust_id VARCHAR(10), Cust_Name VARCHAR(20)) 
INSERT INTO @Customer 
VALUES 
('101','John'), 
('102','Peter') 

DECLARE @Loan_Details TABLE (Id INT, LoanName VARCHAR(20), Cust_Id VARCHAR(10), Amt VARCHAR(10)) 
INSERT INTO @Loan_Details 
VALUES 
(1,'PersonalLoan','101','2L'), 
(2,'PersonalLoan','101','3L'), 
(3,'HomeLoan','101','10L') 

DECLARE @Product TABLE (Id INT, Cust_Id VARCHAR(10), ProductName VARCHAR(20), Cost INT) 
INSERT INTO @Product 
VALUES 
(1,'101','Product1',1000), 
(2,'101','Product1',2000), 
(3,'101','Product1',3000) 


;WITH Loan AS 
(
    SELECT *, 
     RN = ROW_NUMBER() OVER (PARTITION BY LoanName ORDER BY Id) 
    FROM @Loan_Details 
), 
CusPrd AS 
(
    SELECT 
     C.Cust_id, 
     C.Cust_Name, 
     P.ProductName, 
     P.Cost, 
     P.Id, 
     RN = ROW_NUMBER() OVER (PARTITION BY C.Cust_id ORDER BY P.Id) 
    FROM 
     @Customer C 
     INNER JOIN @Product P ON C.Cust_id = P.Cust_Id 
) 

SELECT C.Cust_id, C.Cust_Name, PL.LoanName [PersonalLoan], PL.Amt, HL.LoanName [HomeLoan], HL.Amt, C.ProductName, C.Cost 
FROM 
    CusPrd C 
    LEFT JOIN Loan PL ON PL.Cust_Id = C.Cust_id AND PL.LoanName ='PersonalLoan' AND C.RN = PL.RN 
    LEFT JOIN Loan HL ON HL.Cust_Id = C.Cust_id AND HL.LoanName ='HomeLoan' AND PL.RN = HL.RN AND C.RN = PL.RN 

結果:

Cust_id Cust_Name   PersonalLoan   Amt  HomeLoan    Amt  ProductName   Cost 
---------- -------------------- -------------------- ---------- -------------------- ---------- -------------------- ----------- 
101  John     PersonalLoan   2L   HomeLoan    10L  Product1    1000 
101  John     PersonalLoan   3L   NULL     NULL  Product1    2000 
101  John     NULL     NULL  NULL     NULL  Product1    3000 
+1

2番目の 'Row_Number'関数の' Cust_Id'に別名がありません –

+0

@ Cool_Br33ze通知ありがとう、私はそれを修正しました。私の言葉では、 "私"と "私"の異なる文字は、私は私のサーバー上でエラーを取得していない理由です。 –