求解下面的SQL题目,之前没学过SQL,自己做了不知道对不对,希望哪位前辈可以给一下解答

shy836732411 2016-04-18 02:38:20
(1) 本次测试运行在MySQL5.5上,用到的表结构如下(SQL形式):

CREATE TABLE 'goods' (
'goods_code' char(32) NOT NULL COMMENT '商品编码 ',
'goods_name' varchar(100) DEFAULT NULL COMMENT '商品名',
PRIMARY KEY ('goods_code')
) COMMENT='商品';

CREATE TABLE `stock_io` (
`io_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`location_code` char(32) NOT NULL COMMENT '库位编码',
`goods_code` char(32) NOT NULL COMMENT '商品编码',
`pack_bcode` char(32) NOT NULL COMMENT '包裹条形码',
`inout_flg` tinyint(4) NOT NULL COMMENT '1:入库 -1:出库',
`qty` decimal(18,4) DEFAULT '0.0000' COMMENT '数量',
`qty_unit` char(32) DEFAULT NULL COMMENT '数量单位',
`update_time` bigint(20) DEFAULT NULL COMMENT '更新时间(UTC毫秒)',
PRIMARY KEY (`io_id`),
KEY `IDX1` (`location_code`,`goods_code`,`pack_bcode`,`inout_flg`),
KEY `IDX2` (`update_time`)
) COMMENT='出入库';

CREATE TABLE 'stock_location' (
'location_code' char(32) NOT NULL COMMENT '库位编号',
'location_name' varchar(100) DEFAULT NULL COMMENT '库位名称',
PRIMARY KEY ('location_code')
) COMMENT='库位';

CREATE TABLE `stock_status` (
`location_code` char(32) NOT NULL COMMENT '库位编码',
`goods_code` char(32) NOT NULL COMMENT '商品编码',
`pack_bcode` char(32) NOT NULL COMMENT '包裹条形码',
`qty` decimal(18,4) DEFAULT '0.0000' COMMENT '数量',
`qty_unit` char(32) DEFAULT NULL COMMENT '数量单位',
`update_time` bigint(20) DEFAULT NULL COMMENT '更新时间(UTC毫秒)',
PRIMARY KEY (`location_code`,`goods_code`,`pack_bcode`),
KEY `IDX1` (`update_time`)
) COMMENT='库存';

(2) 表之间的关系

本次测试的数据表是简化后的仓库管理系统中的入出库记录和库存状态。数据查询的主要目标是 stock_io, stock_status。

stock_io为出入库记录,其主键io_id为顺序番号,每一条记录代表了某商品的1个包裹入库的记录。在实际的业务场景中,通常某一车商品入库时,有多种商品,每种商品有多个包裹,然后1个大的库位里可以堆放多个包裹。

stock_status为库存状态,其主键('location_code','goods_code','pack_bcode')意味以1个库位中的1个包裹为单位记录数量。可以理解为该表的数据来源于出入库的操作,或是库存盘点时的数量调整。

(3) 本题要求

1条SQL查询出符合如下条件的数据:

a. stock_io中,2013年1月入库总数量最少的10种商品。排序顺序为数量,商品编码,都是升序。

b. 对应的各自当前的库存状态(stock_status)中的数量。

c. 对应的各自的商品名称。

d. 输出的字段(select段中的字段),显示名称没有要求,字段顺序为 商品编码,商品名称,1月入库数量,库存状态(stock_status)中的数量。

注意:长期的日常运营下,系统错误或是人为原因,stock_io查询所得的记录未必在stock_status、goods中存在对应的记录,即以stock_io为主表即可。
...全文
1559 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zrbin153 2017-05-11
  • 打赏
  • 举报
回复
今天面试碰到了这个问题,没想出来,回来想想答案感觉应该是

 select s.gcode,g.goods_name,s.qty1,s.qty2 from (select io.goods_code gcode,sum(io.qty) qty1,sum(stu.qty) qty2 from stock_io io left join stock_status stu on (io.goods_code=stu.goods_code and io.location_code=stu.location_code and io.pack_bcode=stu.pack_bcode) where (from_unixtime(io.update_time/1000,'%Y%m'))='201301' and inout_flg=1 group by io.goods_code order by qty1 asc limit 0,10) s left join goods g on (g.goods_code=gcode) order by s.qty1 asc,s.gcode asc;
Xiiiiin 2016-04-26
  • 打赏
  • 举报
回复
Left Join
Xiiiiin 2016-04-26
  • 打赏
  • 举报
回复
select top 10 IO.goods_code, from stock_io IO inner join stock_status ST on IO.goods_code = ST.goods_code inner join goods GO on GO.goods_code = IO.goods_code where left(cast(IO.update_time AS char(50)), 6) = '201301' and IO.inout_flg = 1 group by IO.goods_code, GO.goods_name order by sum(IO.qty), IO.goods_code 你的要求b我没看懂, stock_status表的字段完全就是stock_io的子集嘛, 你可以自己把b条件加上
spiritofdragon 2016-04-18
  • 打赏
  • 举报
回复
这么复杂懒得看啊。一般问题,都是抽象出关键字段。最好还有测试数据。才值得答
--小F-- 2016-04-18
  • 打赏
  • 举报
回复
建议到MYSQL版去问问 或许能有更加专业的回答。

702

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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