如何将多个行转换为SQL Server中的单个行和列的特定顺序

时间:2017-02-02 09:27:32

标签: sql-server database subquery

我的Sql Server数据库中有两个表pay_tbl和bill_tbl,它们的列是

pay_tbl{pay_id typy int --pk, pay_name type varchar} bill_tbl{pay_id type int --> Fk,bill_date type datetime,bill_amount type int,bill-status type varchar}

我正在尝试使用月份名称获取每个pay_ID的最近5个月的结算历史记录,我尝试了一个正常工作的查询并且每行都返回我的历史记录,但我不想要这个,它返回我的结果这样

pay_ID          Month            Amount To Pay    Bill Status
----------      -------------    --------------  -----------
1               January           5000           paid
1               December          6000           Not Paid
2               January           3000           paid
2               December          800            Not Paid

但我想以这种方式得到结果

pay_ID Month  Amount To Pay Bill Status   Month  Amount To Pay    Bill Status

1  January      5000           paid      December 6000            Not Paid
2  January      3000           Paid  December 800            Not paid

我怎么能做到这一点?我试过的这个查询返回结果

SELECT    DATENAME(month, b.bill_date) AS 'Month',b.bill_amount as 'Amount   To Pay', b.bill_status AS 'Bill Status'
 FROM  bill_tbl b
INNER JOIN
          pay_tbl AS p ON b.payment_id = p.pay_ID

1 个答案:

答案 0 :(得分:1)

示例数据:

DECLARE @Table1  TABLE 
        (pay_ID int, Month varchar(8), AmountToPay int, BillStatus varchar(8))
    ;

    INSERT INTO @Table1
        (pay_ID, Month, AmountToPay, BillStatus)
    VALUES
        (1, 'January', 5000, 'paid'),
        (1, 'December', 6000, 'Not Paid'),
        (2, 'January', 3000, 'paid'),
        (2, 'December', 800, 'Not Paid')
    ;

脚本

;WITH CTE AS (
select *, row_number()OVER(PARTITION BY pay_ID ORDER BY (SELECT NULL))RN from @Table1 )
,CTE1 AS (
Select * from  CTE where RN = 1 )
,CTE2 AS (
Select * from  CTE where RN = 2 )


Select row_number()OVER(PARTITION BY J_Month  ORDER BY (SELECT NULL)) AS ID,
J_Month,
J_AmountToPay,
J_BillStatus,
D_Month,
D_AmountToPay,
D_BillStatus 
    from (
    select  
            C.pay_ID J_pay_ID,
            C.Month J_Month,
            C.AmountToPay J_AmountToPay,
            C.BillStatus J_BillStatus,
            CC.Month D_Month,
            CC.AmountToPay D_AmountToPay,
            CC.BillStatus D_BillStatus,
            row_number()OVER(PARTITION BY CC.pay_ID  ORDER BY (SELECT NULL))RNN 
from CTE1 C,CTE2 CC
)T WHERE T.RNN  = 1