34,590
社区成员
发帖
与我相关
我的任务
分享
;WITH t AS (SELECT DISTINCT c.*, CONVERT(VARCHAR(7), x.日期, 120) 日期
FROM @客户表 c INNER JOIN @X业务应收款表 x ON x.客户编号 = c.客户编号
UNION
SELECT c.*, CONVERT(VARCHAR(7), y.日期, 120)
FROM @客户表 c INNER JOIN @Y业务应收款表 y ON y.客户编号 = c.客户编号)
SELECT t.日期 月份,
t.客户抬头,
ISNULL(X.X业务应收款, 0) X业务应收款,
ISNULL(Y.Y业务应收款, 0) Y业务应收款
FROM t
CROSS APPLY(SELECT SUM(金额) X业务应收款
FROM @X业务应收款表
WHERE CONVERT(VARCHAR(7), 日期, 120) = t.日期)X
CROSS APPLY(SELECT SUM(金额) Y业务应收款
FROM @Y业务应收款表
WHERE CONVERT(VARCHAR(7), 日期, 120) = t.日期)Y
ORDER BY t.日期,
t.客户抬头;
DECLARE @客户表 TABLE(客户编号 VARCHAR(10) NOT NULL, 客户抬头 NVARCHAR(100) NOT NULL)
INSERT @客户表(客户编号, 客户抬头)
VALUES ('0001','A公司'), ('0002','B公司')
DECLARE @X业务应收款表 TABLE(客户编号 VARCHAR(10) NOT NULL, 日期 DATE NOT NULL, 金额 MONEY NOT NULL)
INSERT @X业务应收款表(客户编号, 日期, 金额)
VALUES('0001','2018-9-12',2000),('0001','2018-9-16',1500),('0001','2018-10-23',3000),
('0001','2018-11-23',2600),('0002','2018-9-15',3200),('0002','2018-10-19',5000)
DECLARE @Y业务应收款表 TABLE(客户编号 VARCHAR(10) NOT NULL, 日期 DATE NOT NULL, 金额 MONEY NOT NULL)
INSERT @Y业务应收款表(客户编号, 日期, 金额)
VALUES('0001','2018-8-22',16000),('0001','2018-10-12',12000),('0001','2018-10-16',10000),
('0002','2018-11-15',13200),('0002','2018-12-19',25000)
;WITH datas AS (SELECT c.*, CONVERT(VARCHAR(7), x.日期, 120) AS 月份,
x.金额,'X' AS 类型
FROM @客户表 c
INNER JOIN @X业务应收款表 x ON x.客户编号 = c.客户编号
UNION ALL
SELECT c.*,CONVERT(VARCHAR(7), y.日期, 120) AS 月份,
y.金额,'Y'
FROM @客户表 c
INNER JOIN @Y业务应收款表 y ON y.客户编号 = c.客户编号)
SELECT p.月份,p.客户抬头,
ISNULL(p.X, 0) AS X业务应收款,
ISNULL(p.Y, 0) AS Y业务应收款
FROM datas d
PIVOT(SUM(d.金额) FOR 类型 IN(X, Y)) AS p
ORDER BY p.月份,p.客户编号;
--测试数据
if not object_id(N'Tempdb..#C') is null
drop table #C
Go
Create table #C([客户编号] nvarchar(24),[客户抬头] nvarchar(23))
Insert #C
select N'0001',N'A公司' union all
select N'0002',N'B公司' union all
select N'0003',N'C公司'
GO
if not object_id(N'Tempdb..#X') is null
drop table #X
Go
Create table #X([客户编号] nvarchar(24),[日期] Date,[金额] int)
Insert #X
select N'0001','2018-9-12',2000 union all
select N'0001','2018-9-16',1500 union all
select N'0001','2018-10-23',3000 union all
select N'0001','2018-11-23',2600 union all
select N'0002','2018-9-15',3200 union all
select N'0002','2018-10-19',5000
Go
if not object_id(N'Tempdb..#Y') is null
drop table #Y
Go
Create table #Y([客户编号] nvarchar(24),[日期] Date,[金额] int)
Insert #Y
select N'0001','2018-8-22',16000 union all
select N'0001','2018-10-12',12000 union all
select N'0001','2018-10-16',10000 union all
select N'0002','2018-11-15',13200 union all
select N'0002','2018-12-19',25000
Go
--测试数据结束
SELECT tt.日期,客户抬头,ISNULL(tt.X业务应收款,0) AS X业务应收款,ISNULL(tt.Y业务应收款,0) AS Y业务应收款
FROM #C
LEFT JOIN (
SELECT ISNULL(t.客户编号,t1.客户编号) AS 客户编号,
ISNULL(t.日期,t1.日期) AS 日期,
t.金额 AS X业务应收款,
t1.金额 AS Y业务应收款
FROM (SELECT 客户编号,
RTRIM(YEAR(日期)) +'-'+ RTRIM(MONTH(日期)) AS 日期,
SUM(金额) AS 金额
FROM #X
GROUP BY 客户编号,
RTRIM(YEAR(日期)) +'-'+ RTRIM(MONTH(日期)))t FULL JOIN ( SELECT 客户编号,
RTRIM(YEAR(日期)) +'-'+ RTRIM(MONTH(日期)) AS 日期,
SUM(金额) AS 金额
FROM #Y
GROUP BY 客户编号,
RTRIM(YEAR(日期)) +'-'+ RTRIM(MONTH(日期))) t1 ON t1.客户编号 = t.客户编号 AND t1.日期 = t.日期
)tt ON tt.客户编号 = #C.客户编号
WHERE tt.日期 IS NOT NULL
--测试数据
if not object_id(N'Tempdb..#C') is null
drop table #C
Go
Create table #C([客户编号] nvarchar(24),[客户抬头] nvarchar(23))
Insert #C
select N'0001',N'A公司' union all
select N'0002',N'B公司' union all
select N'0003',N'C公司'
GO
if not object_id(N'Tempdb..#X') is null
drop table #X
Go
Create table #X([客户编号] nvarchar(24),[日期] Date,[金额] int)
Insert #X
select N'0001','2018-9-12',2000 union all
select N'0001','2018-9-16',1500 union all
select N'0001','2018-10-23',3000 union all
select N'0001','2018-11-23',2600 union all
select N'0002','2018-9-15',3200 union all
select N'0002','2018-10-19',5000
Go
if not object_id(N'Tempdb..#Y') is null
drop table #Y
Go
Create table #Y([客户编号] nvarchar(24),[日期] Date,[金额] int)
Insert #Y
select N'0001','2018-8-22',16000 union all
select N'0001','2018-10-12',12000 union all
select N'0001','2018-10-16',10000 union all
select N'0002','2018-11-15',13200 union all
select N'0002','2018-12-19',25000
Go
--测试数据结束
SELECT tt.日期,客户抬头,tt.X业务应收款,tt.Y业务应收款
FROM #C
LEFT JOIN (
SELECT ISNULL(t.客户编号,t1.客户编号) AS 客户编号,
ISNULL(t.日期,t1.日期) AS 日期,
t.金额 AS X业务应收款,
t1.金额 AS Y业务应收款
FROM (SELECT 客户编号,
RTRIM(YEAR(日期)) +'-'+ RTRIM(MONTH(日期)) AS 日期,
SUM(金额) AS 金额
FROM #X
GROUP BY 客户编号,
RTRIM(YEAR(日期)) +'-'+ RTRIM(MONTH(日期)))t FULL JOIN ( SELECT 客户编号,
RTRIM(YEAR(日期)) +'-'+ RTRIM(MONTH(日期)) AS 日期,
SUM(金额) AS 金额
FROM #Y
GROUP BY 客户编号,
RTRIM(YEAR(日期)) +'-'+ RTRIM(MONTH(日期))) t1 ON t1.客户编号 = t.客户编号 AND t1.日期 = t.日期
)tt ON tt.客户编号 = #C.客户编号
WHERE tt.日期 IS NOT NULL