菜鸟请教: 求SQL语句...................

galaxy_1981 2019-10-16 02:47:12
客户表:C
客户编号, 客户抬头
0001 A公司
0002 B公司
X业务应收款表:X
客户编号, 日期, 金额
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
Y业务应收款表:Y
客户编号, 日期, 金额
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

现在需要每个客户按月生成汇总报表,求SQL语句,谢谢
月份 客户抬头 X业务应收款 Y业务应收款
2018-8 A公司 0 16000
2018-9 A公司 3500 0
2018-10 A公司 3000 22000
2018-11 A公司 2600 0
...全文
135 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hello World, 2019-10-16
  • 打赏
  • 举报
回复
第二种思路,将客户和日期先取出来,再用cross apply计算金额,结果是一样的:
;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.客户抬头;
Hello World, 2019-10-16
  • 打赏
  • 举报
回复
可以将数据合并后用PIVOT转置:
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.客户编号;

二月十六 版主 2019-10-16
  • 打赏
  • 举报
回复
--测试数据
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
二月十六 版主 2019-10-16
  • 打赏
  • 举报
回复
--测试数据
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


34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧