繁体   English   中英

sqlserver 记录需要水平来

[英]sqlserver records need to come horizontly

我有下面的表结构,

表名:客户

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

你可以试试这个查询。

如果您也想列出“Peter”,只需在 CusPrd 子查询中将INNER JOIN更改为LEFT 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
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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM