--建立表结构
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tCustomer]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tCustomer]
GOCREATE 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]
GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tCustomerLoan]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tCustomerLoan]
GOCREATE 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]
GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tCustomerReturn]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tCustomerReturn]
GOCREATE 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',nullinsert 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.000 NULL NULL
10001 张三 男 2006-01-01 00:00:00.000 18152.430 2006-02-27 00:00:00.000 NULL NULL
10001 张三 男 2006-01-01 00:00:00.000 18152.430 2006-03-27 00:00:00.000 NULL NULL
10001 张三 男 2006-01-01 00:00:00.000 18152.430 2006-04-27 00:00:00.000 NULL NULL
10001 张三 男 2006-01-01 00:00:00.000 18152.430 2006-05-27 00:00:00.000 NULL NULL
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 NULL NULL 8152.430 2006-01-31 00:00:00.000
10001 张三 男 2006-01-01 00:00:00.000 NULL NULL 8152.430 2006-02-27 00:00:00.000
10002 李四 男 2006-01-01 00:00:00.000 NULL NULL NULL NULL
10002 李四 男 2006-01-01 00:00:00.000 NULL NULL NULL NULL
--想得到如下显示结果:'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

解决方案 »

  1.   

    select * 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)
      

  2.   

    我想再问一下,如果我在查询结果后边加一个balance字段,计算方法是本行的LoanDate- ReturnDate加上上一行的差值.这样该怎么写?谢谢大哥~
      

  3.   

    select id=identity(int,1,1), * 
    into #
    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)select *, balance=(select sum(isnull(LoanDate,0))- sum(isnull(ReturnDate),0) from # where id<=a.id)
    from #
    drop table #
      

  4.   

    新增加的标识列,好像并不是按从小到大的顺序排列的,跟如下形式'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显示的还有一些区别~不知道有没有办法~
      

  5.   

    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)
    )aaselect *, balance=(select sum(isnull(LoanDate,0))- sum(isnull(ReturnDate),0) from # where id<=a.id)
    from #
    drop table #