昨天的面试题不会,请高手指教(一句Sql语句)

v41dugu 2007-08-31 01:23:07
表1(货物总数)
类型 总数
A 900
B 1000



表2(使用了的货物)
类型 使用数
A 20
B 60
A 11


现在要求用一句sql语句打印出A,B各剩了多少
...全文
895 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
system1190 2007-09-01
  • 打赏
  • 举报
回复
Limpire(昨夜小楼)

答案对,也简单。
wuxinyuzhu 2007-09-01
  • 打赏
  • 举报
回复
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',15

select 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
wuxinyuzhu 2007-09-01
  • 打赏
  • 举报
回复
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
fa_ge 2007-09-01
  • 打赏
  • 举报
回复
大家一看到是面試題,興致都很高。
wuxinyuzhu 2007-09-01
  • 打赏
  • 举报
回复
既然是面试就不会这么简单 不是普通的+ - 问题 还考虑到你的思想境界问题 特别对于商业你要考虑的更为周全一些
懒牛科技 2007-08-31
  • 打赏
  • 举报
回复
几种都有:
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
) RESULT

select 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
vchao13 2007-08-31
  • 打赏
  • 举报
回复
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 a.类型,a.总数-b.使用数 from (select 类型,sum(使用数) as 使用数 from t2 group by 类型) b,t1 a where a.类型=b.类型

drop table t1,t2
蓝色流星 2007-08-31
  • 打赏
  • 举报
回复
学习......
NORTHCHERT 2007-08-31
  • 打赏
  • 举报
回复
用子查询就可以了
SoftwKLC 2007-08-31
  • 打赏
  • 举报
回复
什么公司(什么职位)的面试题目啊?
wendyc 2007-08-31
  • 打赏
  • 举报
回复
b求总 然后 a-b
  • 打赏
  • 举报
回复
顶顶!
dawugui 2007-08-31
  • 打赏
  • 举报
回复
不过,我个人认为没必要搞这么复杂.

直接等于就行了.
scmyxj 2007-08-31
  • 打赏
  • 举报
回复
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.类型
OracleRoob 2007-08-31
  • 打赏
  • 举报
回复
在类似超市这样的模式下,有可能商品还没有入库,就已经开始销售了,从而形成负销售
w75251455 2007-08-31
  • 打赏
  • 举报
回复
再次无语....
你的两个写法上面都有~~~~
dawugui 2007-08-31
  • 打赏
  • 举报
回复
还有负销售,没东西如何销售?

如果真有,就把left join 改为 full join

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)
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 行)
*/
OracleRoob 2007-08-31
  • 打赏
  • 举报
回复
如果允许负销售,只用left join,还不够,还需要union上 right join
w75251455 2007-08-31
  • 打赏
  • 举报
回复
无语.......
dawugui 2007-08-31
  • 打赏
  • 举报
回复
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 行)
*/
加载更多回复(20)

34,587

社区成员

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

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