用户
 找回密码
 入住 CI 中国社区
搜索
查看: 3776|回复: 11
收起左侧

[HELP] SQL: 一句sql语句查询表中A、B产品的剩余数量

[复制链接]
发表于 2014-9-14 17:58:57 | 显示全部楼层 |阅读模式
本帖最后由 Yip 于 2014-9-15 11:35 编辑

题目:
数据库中有表TI,表示仓库中有产品若干,MC是产品名称,ZT表示状态,IN表示入库,OUT表示出库,SL是数量;
请用一句SQL语句,显示产品A、B的剩余数量。
-------------------------
|MC     |ZT    |SL    |
------------------------
|A        |IN    |200  |
------------------------
|B        |IN    |100  |
------------------------
|A        |OUT |20    |
------------------------

·
·省略其他行
·

小弟SQL基础没打好,请各位大神不吝赐教,谢谢~

=================================
看到大家的评论回答,很感激;
不过题干有几点可能大家没注意到,
第一、求A、B的剩余数量,即 IN的数量减去OUT的数量;
第二、上面表T1只是前3行数据,后面省略了其他记录,也就是表里面还有可能C、D··等等的产品;

所以,理想的结果应该是这样的:
|MC(名称)|RESULT(剩余)|
|A                 |A的剩余数量      |
|B                 |B的剩余数量      |


只是目前还写不出一句SQL可以满足以上需求(用MySQL更好^_^),恳请各位大大帮忙,谢谢~
发表于 2014-9-15 09:40:51 | 显示全部楼层
本帖最后由 xjmroot 于 2014-9-15 10:07 编辑

给你参考参考
SQL复制代码
SELECT A.MC,totalin-IF(isnull(totalout),0,totalout) AS totalout FROM (SELECT MC,SUM(SL) AS totalin FROM TI WHERE ZT='IN' GROUP BY MC) AS A LEFT JOIN (SELECT MC,SUM(SL) AS totalout FROM TI WHERE ZT='OUT' GROUP BY MC) AS B ON A.MC=B.MC;
复制代码


mysql> select A.MC,if(isnull(totalin),0,totalin) as totalin,if(isnull(totalout),0,totalout) as totalout from (select MC,sum(SL) as totalin from TI where ZT='IN' group by MC) as A left join (select MC,sum(SL) as totalout from TI where ZT='OUT' group by MC) as B on A.MC=B.MC;
+----+---------+----------+
| MC | totalin | totalout |
+----+---------+----------+
| A  | 200     | 20       |
| B  | 100     | 0        |
+----+---------+----------+
2 rows in set

mysql>




发表于 2014-9-15 10:04:44 | 显示全部楼层
Closer 发表于 2014-9-15 09:54
抱歉抱歉~
沒注意到還有OUT那行

select A.MC,totalin-if(isnull(totalout),0,totalout) as totalout from (select MC,sum(SL) as totalin from TI where ZT='IN' group by MC) as A left join (select MC,sum(SL) as totalout from TI where ZT='OUT' group by MC) as B on A.MC=B.MC;
这个可以的,应该还有简单的。再想想

发表于 2014-9-15 10:25:50 | 显示全部楼层
本帖最后由 Closer 于 2014-9-15 10:28 编辑
xjmroot 发表于 2014-9-15 10:04
select A.MC,totalin-if(isnull(totalout),0,totalout) as totalout from (select MC,sum(SL) as totalin  ...

受到你的啟發,所以去找了一下可以利用SUM和GROUP BY

SELECT MC, SUM(SL) AS SL FROM `TI` GROUP BY MC


這個語法的前提是,OUT項的值要改成負數

也就是 -20 ,這樣可以讓語法精簡很多






发表于 2014-9-15 09:20:36 | 显示全部楼层
基礎要打好,沒基礎,任何人都可以取代你
MySQL 超新手入門(3)SELECT 基礎查詢


select MC, SL from `TI` where MC='A' or MC='B'

語法應該是這樣





发表于 2014-9-15 09:54:16 | 显示全部楼层
xjmroot 发表于 2014-9-15 09:40
这咋显示、总量都不知道

抱歉抱歉~
沒注意到還有OUT那行


樓主這個需求我還真弄不出來...
发表于 2014-9-15 10:06:27 | 显示全部楼层

论坛蛮活跃的吗。。。我咋听说CI框架要过时了。是真的吗
发表于 2014-9-15 11:51:10 | 显示全部楼层
你的OUT值為什麼不在建立前先 * (-1)
這樣語法就很簡單了阿
 楼主| 发表于 2014-9-15 12:13:34 | 显示全部楼层
Closer 发表于 2014-9-15 11:51
你的OUT值為什麼不在建立前先 * (-1)
這樣語法就很簡單了阿

这只是一道试题{:soso_e100:}

本版积分规则