34,576
社区成员
发帖
与我相关
我的任务
分享
-- 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
*/
-- 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
*/
--测试数据
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.日期;
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