create table T1 (类型 varchar(100), 总数 int)insert into T1 select 'A', 900 insert into T1 select 'B', 1000 create table T2 (类型 varchar(100), 使用数 int) insert into T2 select 'A', 20 insert into T2 select 'B', 60 insert into T2 select 'A', 11 select 类型,sum(数量) as 剩余数量 from ( select 类型,总数 as 数量 from T1 union all select 类型,使用数*(-1) as 数量 from T2 ) as t group by 类型drop table T1,T2 /*--结果类型 剩余数量 A 869 B 940*/
select a.类型,(a.总数-b.使用数)[剩] from 表1 a join (select 类型, sum(使用数)使用数 from 表2 group by 类型)b on a.类型=b.类型
--创建测试表T1 create table T1 (类型 varchar(100), 总数 int)--追加测试数据 insert into T1 select 'A', 900 insert into T1 select 'B', 1000--创建测试表T2 create table T2 (类型 varchar(100), 使用数 int)--追加测试数据 insert into T2 select 'A', 20 insert into T2 select 'B', 60 insert into T2 select 'A', 11 --你要的SQL语句 select 类型,sum(数量) as 剩余数量 from ( select 类型,总数 as 数量 from T1 union all select 类型,使用数*(-1) as 数量 from T2 ) as t group by 类型 --删除测试表 drop table T1,T2 /*--结果类型 剩余数量 A 869 B 940*/
用union all方式处理的,可以确保 有总数、无使用,或者有使用、无总数的,也能统计出来。
那换full join 就要以了!!
--光full join,还不够,需要用isnull()函数,否则,都是空--如: --创建测试表T1 create table T1 (类型 varchar(100), 总数 int)--追加测试数据 insert into T1 select 'A', 900 insert into T1 select 'B', 1000 insert into T1 select 'C', 1000--创建测试表T2 create table T2 (类型 varchar(100), 使用数 int)--追加测试数据 insert into T2 select 'A', 20 insert into T2 select 'B', 60 insert into T2 select 'A', 11 --你要的SQL语句 select 类型,sum(数量) as 剩余数量 from ( select 类型,总数 as 数量 from T1 union all select 类型,使用数*(-1) as 数量 from T2 ) as t group by 类型 select a.类型,(isnull(a.总数,0)-isnull(b.使用数,0)) as [剩余数量] from T1 a full join (select 类型,sum(使用数)使用数 from T2 group by 类型)b on a.类型=b.类型--删除测试表 drop table T1,T2 /*--结果类型 剩余数量 A 869 B 940*/
select 类型,总数-(select sum(表2.使用数) from 表2 where 表1.类型 = 表2.类型) from 表1没错! 还是第一次答贴
select a.類型,a.總數-b.使用數 as balance from t1 a left join ( select 類型,sum(使用數)as 使用數 from t2 group by 類型 ) b on a.類型=b.類型類型 balance ---------------------------------------------------------------------------------------------------- ----------- A 869 B 940(2 row(s) affected)
create table 表1 (类型 varchar(100), 总数 int)insert into 表1 select 'A', 900 insert into 表1 select 'B', 1000 insert into 表1 select 'C', 1000 create table 表2 (类型 varchar(100), 使用数 int) insert into 表2 select 'A', 20 insert into 表2 select 'B', 60 insert into 表2 select 'A', 11 insert into 表2 select 'D', 11select isnull(a.类型,b.类型)[类型],(isnull(a.总数,0)-isnull(b.使用数,0))[剩] from 表1 a full join (select 类型, sum(使用数)使用数 from 表2 group by 类型)b on a.类型=b.类型
--按照题目,这个最简单select a.类型, 剩余=a.总数-sum(b.使用数) from 表1 a, 表2 b where a.类型=b.类型 group by a.类型, a.总数
--按照题意,现实中也是这个最简单,因为如果出现同一个A有两个不同的总数,那就是原始数据错了。declare @T1 table (类型 varchar(1), 总数 int) insert @T1 select 'A',900 union all select 'B',1000declare @T2 table (类型 varchar(1), 使用数 int) insert @T2 select 'A',20 union all select 'B',60 union all select 'A',11select a.类型, 剩余=a.总数-sum(b.使用数) from @T1 a, @T2 b where a.类型=b.类型 group by a.类型, a.总数/* 类型 剩余 A 869 B 940 */
니 바보 야 !
回复人:yes196196() ( 一级(初级)) 信誉:100 2007-08-31 13:36:42 得分:0select 类型,总数-(select sum(表2.使用数) from 表2 where 表1.类型 = 表2.类型) from 表1没错! 还是第一次答贴---------------------------------------------确实没错
虽然题目简单,但是也学到了不少东西 原来以为只要减一下就可以了,没有想到为了保证安全需要用 union all 学习了,哈哈 g g study d d up
select a.类型 , a.总数 - isnull(b.使用数) 0 剩余数 from tb1 a left join (select 类型 , sum(使用数) 使用数 from tb2 group by 类型) b on a.类型 = b.类型
create table tb1(类型 varchar(10), 总数 int) insert into tb1 values('A', 900) insert into tb1 values('B', 1000) create table tb2(类型 varchar(10), 使用数 int) insert into tb2 values('A', 20) insert into tb2 values('B', 60) insert into tb2 values('A', 11) go select a.类型 , a.总数 - isnull(b.使用数,0) 剩余数 from tb1 a left join (select 类型 , sum(使用数) 使用数 from tb2 group by 类型) b on a.类型 = b.类型 order by a.类型 drop table tb1,tb2/*类型 剩余数 ---------- ----------- A 869 B 940(所影响的行数为 2 行) */
如果允许负销售,只用left join,还不够,还需要union上 right join
还有负销售,没东西如何销售?如果真有,就把left join 改为 full joincreate table tb1(类型 varchar(10), 总数 int) insert into tb1 values('A', 900) insert into tb1 values('B', 1000) create table tb2(类型 varchar(10), 使用数 int) insert into tb2 values('A', 20) insert into tb2 values('B', 60) insert into tb2 values('A', 11) insert into tb2 values('C', 11) go select isnull(a.类型,b.类型) 类型 , isnull(a.总数,0) - isnull(b.使用数,0) 剩余数 from tb1 a full join (select 类型 , sum(使用数) 使用数 from tb2 group by 类型) b on a.类型 = b.类型 order by a.类型 drop table tb1,tb2/* 类型 剩余数 ---------- ----------- A 869 B 940 C -11(所影响的行数为 3 行) */
SELECT A.类型,(SUM(A.总数) - SUM(B.使用数)) 剩余数 FROM ( SELECT 类型,SUM(总数) 总数 FROM 表1 GROUP BY 类型 ) A, ( SELECT 类型,SUM(使用数) 使用数 FROM 表2 GROUP BY 类型 ) B WHERE A.类型=B.类型 GROUP BY A.类型
create table T1 (类型 varchar(100), 总数 int)insert into T1 select 'A', 900 insert into T1 select 'B', 1000 create table T2 (类型 varchar(100), 使用数 int) insert into T2 select 'A', 20 insert into T2 select 'B', 60 insert into T2 select 'A', 11select a.类型,a.总数-b.使用数 from (select 类型,sum(使用数) as 使用数 from t2 group by 类型) b,t1 a where a.类型=b.类型drop table t1,t2
几种都有: USE DEMO GO CREATE TABLE TABLE1( G_TYPE VARCHAR(3), G_AMOUNT INT ) INSERT INTO TABLE1(G_TYPE,G_AMOUNT)VALUES ('A',900) INSERT INTO TABLE1(G_TYPE,G_AMOUNT)VALUES ('B',1000) CREATE TABLE DETAILS ( G_TYPE VARCHAR(3), USED_AMOUNT INT ) insert into details values('A',20) insert into details values('B',60) insert into details values('A',11) ---TEST SELECT SUM (G_AMOUNT) FROM ( SELECT G_TYPE,G_AMOUNT FROM TABLE1 union all SELECT G_TYPE,USED_AMOUNT*(-1) FROM DETAILS ) RESULTselect a.g_type,a.G_amount-isnull(b.USED_AMOUNT,0) as lefts from table1 a left join (select g_type,sum(used_amount) as USED_AMOUNT from details group by g_type) b on a.g_type=b.g_type order by a.g_type
declare @t table(lei varchar(10),zong int) insert into @t select 'a',800 union all select 'b',1000 declare @b table(lei varchar(10),yong int) insert into @b select 'a',200 union all select 'b',11 union all select 'a',20 select b.lei,shengyu=a.zong-sum(b.yong) from @t a inner join @b b on a.lei=b.lei group by b.lei,a.zong
declare @t table(lei varchar(10),zong int) insert into @t select 'a',800 union all select 'b',1000 union all select 'c',1000 --你的汉字变成拼音了 declare @b table(lei varchar(10),yong int) insert into @b select 'a',200 union all select 'b',11 union all select 'a',20 union all select 'd',15select isnull(a.lei,b.lei),(isnull(a.zong,0)-isnull(b.yong,0)) sheng from @t a full join (select lei, sum(yong) yong from @b group by lei) b on a.lei=b.lei
insert into T1 select 'B', 1000
create table T2 (类型 varchar(100), 使用数 int)
insert into T2 select 'A', 20
insert into T2 select 'B', 60
insert into T2 select 'A', 11
select 类型,sum(数量) as 剩余数量
from
(
select 类型,总数 as 数量
from T1
union all
select 类型,使用数*(-1) as 数量
from T2
) as t
group by 类型drop table T1,T2
/*--结果类型 剩余数量
A 869
B 940*/
from
表1 a join
(select 类型, sum(使用数)使用数 from 表2 group by 类型)b
on a.类型=b.类型
--创建测试表T1
create table T1 (类型 varchar(100), 总数 int)--追加测试数据
insert into T1 select 'A', 900
insert into T1 select 'B', 1000--创建测试表T2
create table T2 (类型 varchar(100), 使用数 int)--追加测试数据
insert into T2 select 'A', 20
insert into T2 select 'B', 60
insert into T2 select 'A', 11
--你要的SQL语句
select 类型,sum(数量) as 剩余数量
from
(
select 类型,总数 as 数量
from T1
union all
select 类型,使用数*(-1) as 数量
from T2
) as t
group by 类型
--删除测试表
drop table T1,T2
/*--结果类型 剩余数量
A 869
B 940*/
--创建测试表T1
create table T1 (类型 varchar(100), 总数 int)--追加测试数据
insert into T1 select 'A', 900
insert into T1 select 'B', 1000
insert into T1 select 'C', 1000--创建测试表T2
create table T2 (类型 varchar(100), 使用数 int)--追加测试数据
insert into T2 select 'A', 20
insert into T2 select 'B', 60
insert into T2 select 'A', 11
--你要的SQL语句
select 类型,sum(数量) as 剩余数量
from
(
select 类型,总数 as 数量
from T1
union all
select 类型,使用数*(-1) as 数量
from T2
) as t
group by 类型
select a.类型,(isnull(a.总数,0)-isnull(b.使用数,0)) as [剩余数量]
from T1 a
full join (select 类型,sum(使用数)使用数 from T2 group by 类型)b
on a.类型=b.类型--删除测试表
drop table T1,T2
/*--结果类型 剩余数量
A 869
B 940*/
from 表1没错!
还是第一次答贴
left join
(
select 類型,sum(使用數)as 使用數 from t2 group by 類型
) b on a.類型=b.類型類型 balance
---------------------------------------------------------------------------------------------------- -----------
A 869
B 940(2 row(s) affected)
create table 表1 (类型 varchar(100), 总数 int)insert into 表1 select 'A', 900
insert into 表1 select 'B', 1000
insert into 表1 select 'C', 1000
create table 表2 (类型 varchar(100), 使用数 int)
insert into 表2 select 'A', 20
insert into 表2 select 'B', 60
insert into 表2 select 'A', 11
insert into 表2 select 'D', 11select isnull(a.类型,b.类型)[类型],(isnull(a.总数,0)-isnull(b.使用数,0))[剩]
from
表1 a full join
(select 类型, sum(使用数)使用数 from 表2 group by 类型)b
on a.类型=b.类型
insert @T1
select 'A',900 union all
select 'B',1000declare @T2 table (类型 varchar(1), 使用数 int)
insert @T2
select 'A',20 union all
select 'B',60 union all
select 'A',11select a.类型, 剩余=a.总数-sum(b.使用数) from @T1 a, @T2 b where a.类型=b.类型 group by a.类型, a.总数/*
类型 剩余
A 869
B 940
*/
from 表1没错!
还是第一次答贴---------------------------------------------确实没错
原来以为只要减一下就可以了,没有想到为了保证安全需要用 union all
学习了,哈哈
g g study d d up
left join
(select 类型 , sum(使用数) 使用数 from tb2 group by 类型) b
on a.类型 = b.类型
insert into tb1 values('A', 900)
insert into tb1 values('B', 1000)
create table tb2(类型 varchar(10), 使用数 int)
insert into tb2 values('A', 20)
insert into tb2 values('B', 60)
insert into tb2 values('A', 11)
go
select a.类型 , a.总数 - isnull(b.使用数,0) 剩余数 from tb1 a
left join
(select 类型 , sum(使用数) 使用数 from tb2 group by 类型) b
on a.类型 = b.类型
order by a.类型
drop table tb1,tb2/*类型 剩余数
---------- -----------
A 869
B 940(所影响的行数为 2 行)
*/
insert into tb1 values('A', 900)
insert into tb1 values('B', 1000)
create table tb2(类型 varchar(10), 使用数 int)
insert into tb2 values('A', 20)
insert into tb2 values('B', 60)
insert into tb2 values('A', 11)
insert into tb2 values('C', 11)
go
select isnull(a.类型,b.类型) 类型 , isnull(a.总数,0) - isnull(b.使用数,0) 剩余数 from tb1 a
full join
(select 类型 , sum(使用数) 使用数 from tb2 group by 类型) b
on a.类型 = b.类型
order by a.类型
drop table tb1,tb2/*
类型 剩余数
---------- -----------
A 869
B 940
C -11(所影响的行数为 3 行)
*/
A.类型,(SUM(A.总数) - SUM(B.使用数)) 剩余数
FROM
(
SELECT 类型,SUM(总数) 总数
FROM 表1
GROUP BY 类型
) A,
(
SELECT 类型,SUM(使用数) 使用数
FROM 表2
GROUP BY 类型
) B
WHERE A.类型=B.类型
GROUP BY A.类型
insert into T1 select 'B', 1000
create table T2 (类型 varchar(100), 使用数 int)
insert into T2 select 'A', 20
insert into T2 select 'B', 60
insert into T2 select 'A', 11select a.类型,a.总数-b.使用数 from (select 类型,sum(使用数) as 使用数 from t2 group by 类型) b,t1 a where a.类型=b.类型drop table t1,t2
USE DEMO GO
CREATE TABLE TABLE1(
G_TYPE VARCHAR(3),
G_AMOUNT INT
)
INSERT INTO TABLE1(G_TYPE,G_AMOUNT)VALUES ('A',900)
INSERT INTO TABLE1(G_TYPE,G_AMOUNT)VALUES ('B',1000)
CREATE TABLE DETAILS
(
G_TYPE VARCHAR(3),
USED_AMOUNT INT
)
insert into details values('A',20)
insert into details values('B',60)
insert into details values('A',11)
---TEST SELECT SUM (G_AMOUNT) FROM
(
SELECT G_TYPE,G_AMOUNT FROM TABLE1
union all
SELECT G_TYPE,USED_AMOUNT*(-1) FROM DETAILS
) RESULTselect a.g_type,a.G_amount-isnull(b.USED_AMOUNT,0) as lefts from table1 a left join
(select g_type,sum(used_amount) as USED_AMOUNT from details group by g_type) b on a.g_type=b.g_type order by a.g_type
insert into @t
select 'a',800
union all select 'b',1000
declare @b table(lei varchar(10),yong int)
insert into @b
select 'a',200
union all select 'b',11
union all select 'a',20
select b.lei,shengyu=a.zong-sum(b.yong) from @t a inner join @b b on a.lei=b.lei group by b.lei,a.zong
insert into @t
select 'a',800
union all select 'b',1000
union all select 'c',1000
--你的汉字变成拼音了
declare @b table(lei varchar(10),yong int)
insert into @b
select 'a',200
union all select 'b',11
union all select 'a',20
union all select 'd',15select isnull(a.lei,b.lei),(isnull(a.zong,0)-isnull(b.yong,0)) sheng from @t a
full join (select lei, sum(yong) yong from @b group by lei) b
on a.lei=b.lei