三表合并的问题

Weaseatiti 2018-10-25 07:55:45
表一

日期 产品 维修数量
2008-1 产品1 2
2008-1 产品2 12
2008-2 产品2 3
2008-5 产品1 1


表二
日期 产品 销售数量
2008-1 产品1 2
2008-2 产品2 3

日期 产品 保养数量
2008-1 产品1 2
2008-2 产品2 3
2008-6 产品2 3

求同一日期 同一产品的 维修数量 销售数量 保养数量 合并,没有就是0
--------------------------------
日期 产品 维修数量 销售数量 保养数量
2008-1 产品1 2 2 2
2008-1 产品2 12 0 0
2008-2 产品2 0 3 3
2008-5 产品1 1 0 0
2008-6 产品2 0 0 3
200
...全文
94 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Weaseatiti 2018-10-26
  • 打赏
  • 举报
回复
我自己用了笨方法,先取所有的 单独 日期 产品列。然后 所有表左联! 谢谢
又又0916 2018-10-25
  • 打赏
  • 举报
回复
引用 7 楼 sinat_28984567 的回复:
[quote=引用 6 楼 weixin_43472257 的回复:] [quote=引用 3 楼 sinat_28984567 的回复:]
请问版主你的建表代码是怎么生成的?谢谢![/quote] https://blog.csdn.net/roy_88/article/details/51329170[/quote] 谢谢!
二月十六 版主 2018-10-25
  • 打赏
  • 举报
回复
引用 6 楼 weixin_43472257 的回复:
[quote=引用 3 楼 sinat_28984567 的回复:]

请问版主你的建表代码是怎么生成的?谢谢![/quote]
https://blog.csdn.net/roy_88/article/details/51329170
又又0916 2018-10-25
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
请问版主你的建表代码是怎么生成的?谢谢!
又又0916 2018-10-25
  • 打赏
  • 举报
回复
还有第二种写法,用union all

-- CREATE TESTING TABLE
CREATE TABLE #维修 (日期 NVARCHAR(10),产品 NVARCHAR(10),维修数量 int)
INSERT #维修 (日期,产品,维修数量)
SELECT N'2008-1',N'产品1',N'2' UNION ALL
SELECT N'2008-1',N'产品2',N'12' UNION ALL
SELECT N'2008-2',N'产品2',N'3' UNION ALL
SELECT N'2008-5',N'产品1',N'1'
GO

-- CREATE TESTING TABLE
CREATE TABLE #销售(日期 NVARCHAR(10),产品 NVARCHAR(10),销售数量 int)
INSERT #销售(日期,产品,销售数量)
SELECT N'2008-1',N'产品1',N'2' UNION ALL
SELECT N'2008-2',N'产品2',N'3'
GO

-- CREATE TESTING TABLE
CREATE TABLE #保养(日期 NVARCHAR(10),产品 NVARCHAR(10),保养数量 int)
INSERT #保养(日期,产品,保养数量)
SELECT N'2008-1',N'产品1',N'2' UNION ALL
SELECT N'2008-2',N'产品2',N'3' UNION ALL
SELECT N'2008-6',N'产品2',N'3'
GO

-- RUN QUERY
SELECT a.日期,a.产品,SUM(保养数量) AS 保养数量,SUM(销售数量) AS 销售数量,SUM(维修数量) AS 维修数量
FROM (
	SELECT 日期,产品,保养数量,0 AS 销售数量,0 AS 维修数量 FROM #保养 UNION ALL
	SELECT 日期,产品,0 AS 保养数量,0 AS 销售数量,维修数量 FROM #维修 UNION ALL
	SELECT 日期,产品,0 AS 保养数量,销售数量,0 AS 维修数量 FROM #销售  
) a 
GROUP BY a.日期,a.产品
ORDER BY 日期,产品
GO
-- DROP TESTING TABLE
DROP TABLE #保养
DROP TABLE #维修 
DROP TABLE #销售
GO
/*-- QUERY RESULT
日期         产品         保养数量        销售数量        维修数量
---------- ---------- ----------- ----------- -----------
2008-1     产品1        2           2           2
2008-1     产品2        0           0           12
2008-2     产品2        3           3           3
2008-5     产品1        0           0           1
2008-6     产品2        3           0           0
*/

又又0916 2018-10-25
  • 打赏
  • 举报
回复
-- CREATE TESTING TABLE
CREATE TABLE #维修 (日期 NVARCHAR(10),产品 NVARCHAR(10),维修数量 int)
INSERT #维修 (日期,产品,维修数量)
SELECT N'2008-1',N'产品1',N'2' UNION ALL
SELECT N'2008-1',N'产品2',N'12' UNION ALL
SELECT N'2008-2',N'产品2',N'3' UNION ALL
SELECT N'2008-5',N'产品1',N'1'
GO

-- CREATE TESTING TABLE
CREATE TABLE #销售(日期 NVARCHAR(10),产品 NVARCHAR(10),销售数量 int)
INSERT #销售(日期,产品,销售数量)
SELECT N'2008-1',N'产品1',N'2' UNION ALL
SELECT N'2008-2',N'产品2',N'3'
GO

-- CREATE TESTING TABLE
CREATE TABLE #保养(日期 NVARCHAR(10),产品 NVARCHAR(10),保养数量 int)
INSERT #保养(日期,产品,保养数量)
SELECT N'2008-1',N'产品1',N'2' UNION ALL
SELECT N'2008-2',N'产品2',N'3' UNION ALL
SELECT N'2008-6',N'产品2',N'3'
GO

-- RUN QUERY
SELECT COALESCE(m.日期,s.日期,r.日期) AS 日期,COALESCE(m.产品,s.产品,r.产品) AS 产品
	,ISNULL(m.保养数量,0) AS  保养数量
	,ISNULL(s.销售数量,0) AS  销售数量
	,ISNULL(r.维修数量,0) AS  维修数量
FROM #保养 m
FULL JOIN #维修 r ON r.日期 = m.日期 AND r.产品 = m.产品
FULL JOIN #销售 s ON s.日期 = m.日期 AND s.产品 = m.产品
ORDER BY 日期,产品
GO
-- DROP TESTING TABLE
DROP TABLE #保养
DROP TABLE #维修 
DROP TABLE #销售
GO
/*-- QUERY RESULT
日期         产品         保养数量        销售数量        维修数量
---------- ---------- ----------- ----------- -----------
2008-1     产品1        2           2           2
2008-1     产品2        0           0           12
2008-2     产品2        3           3           3
2008-5     产品1        0           0           1
2008-6     产品2        3           0           0
*/

二月十六 版主 2018-10-25
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([日期] nvarchar(26),[产品] nvarchar(23),[维修数量] int)
Insert #T1
select N'2008-1',N'产品1',2 union all
select N'2008-1',N'产品2',12 union all
select N'2008-2',N'产品2',3 union all
select N'2008-5',N'产品1',1
GO
if not object_id(N'Tempdb..#T2') is null
drop table #T2
Go
Create table #T2([日期] nvarchar(26),[产品] nvarchar(23),[销售数量] int)
Insert #T2
select N'2008-1',N'产品1',2 union all
select N'2008-2',N'产品2',3
GO
if not object_id(N'Tempdb..#T3') is null
drop table #T3
Go
Create table #T3([日期] nvarchar(26),[产品] nvarchar(23),[保养数量] int)
Insert #T3
select N'2008-1',N'产品1',2 union all
select N'2008-2',N'产品2',3 union all
select N'2008-6',N'产品2',3
Go
--测试数据结束
SELECT
COALESCE(#T1.日期, #T2.日期, #T3.日期) AS 日期,
COALESCE(#T1.产品, #T2.产品, #T3.产品) AS 产品,
ISNULL(维修数量,0) 维修数量,
ISNULL(销售数量,0) 销售数量,
ISNULL(保养数量,0) 保养数量
FROM
#T1
FULL JOIN
#T2
ON #T2.产品 = #T1.产品
AND #T2.日期 = #T1.日期
FULL JOIN
#T3
ON #T3.产品 = #T1.产品
AND #T3.日期 = #T1.日期;


吉普赛的歌 版主 2018-10-25
  • 打赏
  • 举报
回复
USE tempdb
GO
IF OBJECT_ID('t1') IS NOT NULL DROP TABLE t1
IF OBJECT_ID('t2') IS NOT NULL DROP TABLE t2
IF OBJECT_ID('t3') IS NOT NULL DROP TABLE t3
GO
CREATE TABLE t1(
	d VARCHAR(10),
	p NVARCHAR(20),
	repairNum INT	
)
CREATE TABLE t2(
	d VARCHAR(10),
	p NVARCHAR(20),
	saleNum INT	
)
CREATE TABLE t3(
	d VARCHAR(10),
	p NVARCHAR(20),
	protectNum INT	
)
INSERT INTO t1
SELECT '2008-1','产品1',2
UNION ALL SELECT '2008-1','产品2',12
UNION ALL SELECT '2008-2','产品2',3
UNION ALL SELECT '2008-5','产品1',1
GO
INSERT INTO t2
SELECT '2008-1','产品1',2
UNION ALL SELECT '2008-2','产品2',3
GO
INSERT INTO t3
SELECT '2008-1','产品1',2
UNION ALL SELECT '2008-2','产品2',3
UNION ALL SELECT '2008-6','产品2',3
GO

--查询
SELECT
	CASE WHEN t1.d IS NOT NULL THEN t1.d
		WHEN t2.d IS NOT NULL THEN  t2.d 
		ELSE t3.d END AS [日期]
	,CASE WHEN t1.p IS NOT NULL THEN t1.p
		WHEN t2.p IS NOT NULL THEN  t2.p 
		ELSE t3.p END AS [产品]
	,ISNULL(t1.repairNum,0) AS [维修数量]
	,ISNULL(t2.saleNum,0) AS [销售数量]
	,ISNULL(t3.protectNum,0) AS [保养数量]
FROM t1 
	FULL JOIN t2 ON t1.d=t2.d AND t1.p = t2.p
	FULL JOIN t3 ON t2.d=t3.d AND t2.p = t3.p

34,576

社区成员

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

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