应收款报表,最好能写个存储过程,谢谢
CREATE TABLE [dbo].出货列表(
客户名称 [nvarchar](max) NOT NULL,
出货单号 [nvarchar](max) NOT NULL,
出货日期 [datetime] not null,
存货编码 [nvarchar](max) NOT NULL,
数量 [nvarchar](max) NULL,
价格 [nvarchar](max) NOT NULL,
金额 [nvarchar](max) NOT NULL
) ON [PRIMARY]
CREATE TABLE [dbo].收款列表(
客户名称 [nvarchar](max) NOT NULL,
收款单号 [nvarchar](max) NOT NULL,
收款日期 [datetime] NOT NULL,
金额 [nvarchar](max) NOT NULL
) ON [PRIMARY]
insert into 出货列表(客户名称,出货单号,出货日期,存货编码,数量,价格,金额)select '客户一','IV12060001','2012-06-30','701001','2','120','240'
insert into 出货列表(客户名称,出货单号,出货日期,存货编码,数量,价格,金额)select '客户一','IV12060002','2012-06-30','701002','3','100','300'
insert into 出货列表(客户名称,出货单号,出货日期,存货编码,数量,价格,金额)select '客户二','IV12070001','2012-07-30','701003','2','120','240'
insert into 出货列表(客户名称,出货单号,出货日期,存货编码,数量,价格,金额)select '客户一','IV12070001','2012-07-30','701001','2','120','240'
insert into 出货列表(客户名称,出货单号,出货日期,存货编码,数量,价格,金额)select '客户二','IV12090001','2012-09-30','701004','2','200','400'
insert into 出货列表(客户名称,出货单号,出货日期,存货编码,数量,价格,金额)select '客户一','IV12090001','2012-09-30','701005','1','300','300'
insert into 收款列表(客户名称,收款单号,收款日期,金额)select '客户一','RCV12060001','2012-06-30','1100'
insert into 收款列表(客户名称,收款单号,收款日期,金额)select '客户二','RCV12080001','2012-08-30','300'
insert into 收款列表(客户名称,收款单号,收款日期,金额)select '客户一','RCV12090001','2012-09-30','500'
--select * from 出货列表
--select * from 收款列表
--要的结果
客户名称 类型 前期余额 2012年7月 2012年8月 2012年9月
客户一 发货 540 240 0 300
客户一 收款 1100 0 0 500
客户二 发货 0 240 0 400
客户二 收款 0 0 300 0
最好做一个存储过程
7月以前都属于前期,
[解决办法]
SET NOCOUNT ON
DECLARE @dtMonthStartDATETIME
DECLARE @dtMonthEndDATETIME
SET@dtMonthStart = '2012-07-01'
SET@dtMonthEnd = '2012-11-30'
DECLARE @tb_month TABLE
(
ID INT IDENTITY(1,1) NOT NULL,
strMonth CHAR(7)
)
WHILE 1 = 1
BEGIN
IF(DATEDIFF(MONTH,@dtMonthStart,@dtMonthEnd) < 0)
BREAK
INSERT INTO @tb_month SELECT LEFT(CONVERT(VARCHAR(20),@dtMonthStart,120),7)
SET @dtMonthStart = DATEADD(MONTH,1,@dtMonthStart)
END
DECLARE @strSQL NVARCHAR(4000)
SET @strSQL = N'SELECT
客户名称,
类型, '
DECLARE @i INT = 1
DECLARE @nCount INT
SELECT @nCount = COUNT(*) FROM @tb_month
DECLARE @strMonthCur VARCHAR(7)
DECLARE @strMonthPrev VARCHAR(7)
WHILE @i <= @nCount
BEGIN
SELECT @strMonthCur = strMonth FROM @tb_month WHERE ID = @i
IF @i = 1
SET @strSQL = @strSQL + N' 前期余额 = SUM(CASE WHEN 月份<'''+ @strMonthCur + N''' THEN 金额 ELSE 0 END), '
ELSE IF @i <> @nCount
SET @strSQL = @strSQL + N' ''' + @strMonthCur + N''' = SUM(CASE WHEN 月份>=''' + @strMonthPrev + N''' AND 月份<''' + @strMonthCur +N''' THEN 金额 ELSE 0 END),'
ELSE
SET @strSQL = @strSQL + N' ''' + @strMonthCur + N''' = SUM(CASE WHEN 月份>=''' + @strMonthPrev + N''' AND 月份<''' + @strMonthCur +N''' THEN 金额 ELSE 0 END)'
SET @strMonthPrev = @strMonthCur
SET @i = @i + 1
END
SET @strSQL = @strSQL + N'
FROM
(
SELECT 客户名称, N''发货'' 类型, SUM(CAST(金额 AS INT)) 金额, LEFT(CONVERT(VARCHAR(20),出货日期,120),7) 月份
FROM 出货列表
WHERE 出货日期 <= ''' + CONVERT(VARCHAR(10),@dtMonthEnd,120) + N' 23:59:59'''
+N'
GROUP BY 客户名称, LEFT(CONVERT(VARCHAR(20),出货日期,120),7)
UNION ALL
SELECT 客户名称, N''收款'' 类型, SUM(CAST(金额 AS INT)) 金额, LEFT(CONVERT(VARCHAR(20),收款日期,120),7) 月份
FROM 收款列表
WHERE 收款日期 <= ''' + CONVERT(VARCHAR(10),@dtMonthEnd,120) + N' 23:59:59'''
+N'
GROUP BY 客户名称, LEFT(CONVERT(VARCHAR(20),收款日期,120),7)
)AS A_
GROUP BY
客户名称, 类型
ORDER BY
客户名称, 类型'
EXEC sp_executesql @strSQL
SET NOCOUNT OFF