两个表a,b
a:
订单号 客户名称 产品名称 型号 订单数量
201001002 张三 葡萄 PT 15
201001002 张三 苹果 PG 13
201001002 张三 梨子 LZ 10b:
订单号 客户名称 产品名称 型号 发货数量
201001002 张三 葡萄 PT 2
201001002 张三 苹果 PG 3 查询语句select a.客户名称,a.产品名称,a.型号,isnull(a.订单数量,0) as 订单数量,isnull(b.发货数量,0) as 发货数量,(isnull(a.订单数量,0) - isnull(b.发货数量,0)) as 待生产数量 from
a,
b
where (a.产品名称=b.产品名称) and (a.型号=b.驱动器型号)这样可以得出
客户名称 产品名称 型号 订单数量 发货数量 待生产数量
张三 葡萄 PT 15 2 13
张三 苹果 PG 13 3 10但我想得到下面的结果
客户名称 产品名称 型号 订单数量 发货数量 待生产数量
张三 葡萄 PT 15 2 13
张三 苹果 PG 13 3 10
张三 梨子 LZ 10 0 10如何?
a:
订单号 客户名称 产品名称 型号 订单数量
201001002 张三 葡萄 PT 15
201001002 张三 苹果 PG 13
201001002 张三 梨子 LZ 10b:
订单号 客户名称 产品名称 型号 发货数量
201001002 张三 葡萄 PT 2
201001002 张三 苹果 PG 3 查询语句select a.客户名称,a.产品名称,a.型号,isnull(a.订单数量,0) as 订单数量,isnull(b.发货数量,0) as 发货数量,(isnull(a.订单数量,0) - isnull(b.发货数量,0)) as 待生产数量 from
a,
b
where (a.产品名称=b.产品名称) and (a.型号=b.驱动器型号)这样可以得出
客户名称 产品名称 型号 订单数量 发货数量 待生产数量
张三 葡萄 PT 15 2 13
张三 苹果 PG 13 3 10但我想得到下面的结果
客户名称 产品名称 型号 订单数量 发货数量 待生产数量
张三 葡萄 PT 15 2 13
张三 苹果 PG 13 3 10
张三 梨子 LZ 10 0 10如何?
union all
select * from b
select a.客户名称,a.产品名称,a.型号,isnull(a.订单数量,0) as 订单数量,isnull(b.发货数量,0) as 发货数量,(isnull(a.订单数量,0) - isnull(b.发货数量,0)) as 待生产数量
from a left outer join b on a.订单号 = b.订单号 and a.型号=b.型号
a left join b
on (a.产品名称=b.产品名称) and (a.型号=b.驱动器型号)
张三 苹果 PG 13 3 10
张三 梨子 LZ 10 0 10
ISNULL(b.发货数量, 0) AS 发货数量, ISNULL(a.订单数量, 0) - ISNULL(b.发货数量, 0)
AS 待生产数量
FROM b RIGHT OUTER JOIN
a ON a.产品名称 = b.产品名称 AND a.型号 = b.型号已经经过sql2000查询分析器执行成功!
DROP TABLE [a]
CREATE TABLE [a]
(
[订单号] bit NULL ,
[客户名称] varchar(100) NULL ,
[产品名称] varchar(100) NULL ,
[型号] varchar(100) NULL ,
[订单数量] int NULL
)
GO--插入测试数据
INSERT INTO [a] ([订单号],[客户名称],[产品名称],[型号],[订单数量])
SELECT '201001002','张三','葡萄','PT','15' UNION
SELECT '201001002','张三','苹果','PG','13' UNION
SELECT '201001002','张三','梨子','LZ','10'
GOIF EXISTS (SELECT * FROM sysobjects WHERE NAME ='b')
DROP TABLE [b]
CREATE TABLE [b]
(
[订单号] bit NULL ,
[客户名称] varchar(100) NULL ,
[产品名称] varchar(100) NULL ,
[型号] varchar(100) NULL ,
[发货数量] int NULL
)
GO--插入测试数据
INSERT INTO [b] ([订单号],[客户名称],[产品名称],[型号],[发货数量])
SELECT '201001002','张三','葡萄','PT','2' UNION
SELECT '201001002','张三','苹果','PG','3'
GO
select a.客户名称,a.产品名称,a.型号,isnull(a.订单数量,0) as 订单数量,isnull(b.发货数量,0) as 发货数量,(isnull(a.订单数量,0) - isnull(b.发货数量,0)) as 待生产数量 from
a LEFT JOIN b ON a.产品名称=b.产品名称 AND a.型号=b.型号/*
张三
梨子 LZ 10 0 10 张三
苹果 PG 13 3 10 张三
葡萄 PT 15 2 13
*/
if object_id('tempdb.dbo.#a') is not null drop table #a
create table #a (订单号 int,客户名称 varchar(4),产品名称 varchar(4),型号 varchar(2),订单数量 int)
insert into #a
select 201001002,'张三','葡萄','PT',15 union all
select 201001002,'张三','苹果','PG',13 union all
select 201001002,'张三','梨子','LZ',10
--> 测试数据: #b
if object_id('tempdb.dbo.#b') is not null drop table #b
create table #b (订单号 int,客户名称 varchar(4),产品名称 varchar(4),型号 varchar(2),发货数量 int)
insert into #b
select 201001002,'张三','葡萄','PT',2 union all
select 201001002,'张三','苹果','PG',3select A.客户名称, A.产品名称, A.型号, A.订单数量, ISNULL(B.发货数量,0),待生产数量=A.订单数量-ISNULL(B.发货数量,0) from #a A LEFT JOIN #B B ON A.产品名称=B.产品名称
客户名称 产品名称 型号 订单数量 待生产数量
---- ---- ---- ----------- ----------- -----------
张三 葡萄 PT 15 2 13
张三 苹果 PG 13 3 10
张三 梨子 LZ 10 0 10(所影响的行数为 3 行)
DROP TABLE [a]
CREATE TABLE [a]
(
[订单号] bit NULL ,
[客户名称] varchar(100) NULL ,
[产品名称] varchar(100) NULL ,
[型号] varchar(100) NULL ,
[订单数量] int NULL
)
GO--插入测试数据
INSERT INTO [a] ([订单号],[客户名称],[产品名称],[型号],[订单数量])
SELECT '201001002','张三','葡萄','PT','15' UNION
SELECT '201001002','张三','苹果','PG','13' UNION
SELECT '201001002','张三','梨子','LZ','10'
GOIF EXISTS (SELECT * FROM sysobjects WHERE NAME ='b')
DROP TABLE [b]
CREATE TABLE [b]
(
[订单号] bit NULL ,
[客户名称] varchar(100) NULL ,
[产品名称] varchar(100) NULL ,
[型号] varchar(100) NULL ,
[发货数量] int NULL
)
GO--插入测试数据
INSERT INTO [b] ([订单号],[客户名称],[产品名称],[型号],[发货数量])
SELECT '201001002','张三','葡萄','PT','2' UNION
SELECT '201001002','张三','苹果','PG','3'
GO
select a.客户名称,a.产品名称,a.型号,isnull(a.订单数量,0) as 订单数量,isnull(b.发货数量,0) as 发货数量,(isnull(a.订单数量,0) - isnull(b.发货数量,0)) as 待生产数量 from
a LEFT JOIN b ON a.产品名称=b.产品名称 AND a.型号=b.型号/*
张三 梨子 LZ 10 0 10
张三 苹果 PG 13 3 10
张三 葡萄 PT 15 2 13 葡萄 PT 15 2 13
*/