22,209
社区成员
发帖
与我相关
我的任务
分享
select a.name,isnull(a.stock,0) stock,isnull(b.import,0) import,isnull(c.delivery,0) delivery from
(select name,sum(isnull(stock,0)) stock from a group by name) a left join
(select name,sum(isnull(import,0)) import from b group by name) b on a.name=b.name left join
(select name,sum(isnull(delivery,0)) delivery from c group by name) c on b.name=c.name
----------------------------------------------------------------
-- Author :DBA_Huangzj(發糞塗牆)
-- Date :2013-01-14 14:04:49
-- Version:
-- Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)
-- Jun 17 2011 00:54:03
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1, v.721)
--
----------------------------------------------------------------
--> 测试数据:[A表]
if object_id('[A表]') is not null drop table [A表]
go
create table [A表]([name] varchar(4),[stock(库存)] int)
insert [A表]
select '苹果',10 union all
select '香蕉',20
--> 测试数据:[B表]
if object_id('[B表]') is not null drop table [B表]
go
create table [B表]([name] varchar(4),[import(入库)] int)
insert [B表]
select '苹果',5 union all
select '苹果',10 union all
select '香蕉',20
--> 测试数据:[C表]
if object_id('[C表]') is not null drop table [C表]
go
create table [C表]([name] varchar(4),[delivery(出库)] int)
insert [C表]
select '苹果',5
--------------开始查询--------------------------
select * from [C表]
--------------开始查询--------------------------
select * from [B表]
--------------开始查询--------------------------
select * from [A表]
----------------结果----------------------------
SELECT NAME,SUM(stock)stock,SUM(import) import,SUM(delivery) delivery
FROM (
SELECT NAME,SUM(ISNULL([stock(库存)],0)) stock,0 import,0 delivery
FROM [A表]
GROUP BY NAME
UNION ALL
SELECT NAME,0 stock,SUM(ISNULL([import(入库)],0)) import,0 delivery
FROM [B表]
GROUP BY NAME
UNION ALL
SELECT NAME,0 stock,0 import,SUM(ISNULL([delivery(出库)],0)) delivery
FROM [c表]
GROUP BY NAME
)a
GROUP BY name
/*
NAME stock import delivery
---- ----------- ----------- -----------
苹果 10 15 5
香蕉 20 20 0
(2 行受影响)
*/
with pro_name as
(
select name from A表 union
select name from B表 union
select name from C表
)
select * from pro_name left join A on pro_name.name = A.name
left join B on pro_name.name = B.name
left join C on pro_name.name = C.name
SELECT NAME,SUM(stock)stock,SUM(import) import,SUM(delivery) delivery
FROM (
SELECT a.NAME,SUM(ISNULL(stock,0)) stock,0 import,0 delivery
FROM a
GROUP BY NAME
UNION ALL
SELECT b.NAME,0 stock,SUM(ISNULL(import,0)) import,0 delivery
FROM b
GROUP BY NAME
UNION ALL
SELECT c.NAME,0 stock,0 import,SUM(ISNULL(delivery,0)) delivery
FROM c
GROUP BY NAME
)a
GROUP BY name