我的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
答案 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