请教,如何得到如下显示形式的??另如果在查询结果后边加一个balance字段,计算方法是本行的LoanDate- ReturnDate加上上一行的差值
--建立表结构
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tCustomer]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tCustomer]
GO
CREATE TABLE [dbo].[tCustomer] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[ContractNumber] [varchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,--合同号主键
[CustomerName] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[CustomerSex] [varchar] (2) COLLATE Chinese_PRC_CI_AS NULL ,
[CustomerDate] [datetime] NULL ,
[CustomerDesc] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tCustomerLoan]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tCustomerLoan]
GO
CREATE TABLE [dbo].[tCustomerLoan] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[ContractNumber] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[CustomerID] [int] NULL ,
[Customerloan] [decimal](18, 3) NULL ,
[LoanDate] [datetime] NULL ,
[LoanDesc] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tCustomerReturn]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tCustomerReturn]
GO
CREATE TABLE [dbo].[tCustomerReturn] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[ContractNumber] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[CustomerID] [int] NULL ,
[CustomerReturn] [decimal](18, 3) NULL ,
[ReturnDate] [datetime] NULL ,
[ReturnDesc] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
--插入测试数据
insert tCustomer select '10001','张三','男','2006-01-01',null
insert tCustomer select '10002','李四','男','2006-01-01',null
insert tCustomerLoan select '10001',1,18152.43,'2006-1-27',null
insert tCustomerLoan select '10001',1,18152.43,'2006-2-27',null
insert tCustomerLoan select '10001',1,18152.43,'2006-3-27',null
insert tCustomerLoan select '10001',1,18152.43,'2006-4-27',null
insert tCustomerLoan select '10001',1,18152.43,'2006-5-27',null
insert tCustomerReturn select '10001',1,8152.43,'2006-1-2',null
insert tCustomerReturn select '10001',1,8152.43,'2006-1-31',null
insert tCustomerReturn select '10001',1,8152.43,'2006-2-27',null
--我现在只能得到如下形式:
10001 张三 男 2006-01-01 00:00:00.000 18152.430 2006-01-27 00:00:00.000NULLNULL
10001 张三 男 2006-01-01 00:00:00.000 18152.430 2006-02-27 00:00:00.000NULLNULL
10001 张三 男 2006-01-01 00:00:00.000 18152.430 2006-03-27 00:00:00.000NULLNULL
10001 张三 男 2006-01-01 00:00:00.000 18152.430 2006-04-27 00:00:00.000NULLNULL
10001 张三 男 2006-01-01 00:00:00.000 18152.430 2006-05-27 00:00:00.000NULLNULL
10001 张三 男 2006-01-01 00:00:00.000 NULL NULL 8152.430 2006-01-02 00:00:00.000
10001 张三 男 2006-01-01 00:00:00.000 NULLNULL8152.4302006-01-31 00:00:00.000
10001 张三 男 2006-01-01 00:00:00.000 NULLNULL8152.4302006-02-27 00:00:00.000
10002李四男2006-01-01 00:00:00.000NULLNULLNULLNULL
10002李四男2006-01-01 00:00:00.000NULLNULLNULLNULL
--想得到如下显示结果:
'10001','张三','男','2006-01-01',NULL, Null, 8152.43,'2006-1-2'
'10001','张三','男','2006-01-01',18152.43,'2006-1-27',
'10001','张三','男','2006-01-01',NULL, Null, 8152.43,'2006-1-31
'10001','张三','男','2006-01-01',18152.43,'2006-2-27', 8152.43,'2006-2-27'
'10001','张三','男','2006-01-01',18152.43,'2006-3-27', null, Null
'10001','张三','男','2006-01-01',18152.43,'2006-4-27', null, Null
'10001','张三','男','2006-01-01',18152.43,'2006-5-27', null, Null
回答:
select id=identity(int,1,1), *
into #
from(
select top 100 percent *
from(
select a.ContractNumber, a.CustomerName, a.CustomerSex,
b.Customerloan, b.LoanDate,
CustomerReturn = cast(null as decimal(18,3)), ReturnDate=cast(null as datetime)
from tCustomer a
inner join tCustomerLoan b
on a.ContractNumber = b.ContractNumber
union all
select a.ContractNumber, a.CustomerName, a.CustomerSex,
CustomerReturn = cast(null as decimal(18,3)), ReturnDate=cast(null as datetime),
c.CustomerReturn, c.ReturnDate
from tCustomer a
inner join tCustomerReturn c
on a.ContractNumber = c.ContractNumber
)a
order by ContractNumber, isnull(LoanDate, ReturnDate)
)aa
select *, balance=(select sum(isnull(LoanDate,0))- sum(isnull(ReturnDate),0) from # where id<=a.id)
from #
drop table #