我也觉得是这样的,谢谢 但是,我的交易的记录是不是都要记在一张表上啊?还有现在我将问题转化成这样一个查询货物 单号ID 数量 --------------------- A 1 2 B 3 4 A 2 5按货物分组查找 同组内 最大单号ID 那条记录的 数量
CREATE TABLE `ta` ( `opr_date` date NOT NULL default '0000-00-00', `opr_type` enum('入库','领料','退料') NOT NULL default '入库', `goods_no` int(10) unsigned NOT NULL default '0', `goods_num` int(10) unsigned NOT NULL default '0', KEY `opr_date` (`opr_date`,`opr_type`,`goods_no`) ) TYPE=MyISAMINSERT INTO ta (opr_date, opr_type, goods_no, goods_num) VALUES ('2003-01-03', 1, 1, 34); INSERT INTO ta (opr_date, opr_type, goods_no, goods_num) VALUES ('2003-01-04', 2, 1, 3); INSERT INTO ta (opr_date, opr_type, goods_no, goods_num) VALUES ('2003-01-01', 1, 2, 34); INSERT INTO ta (opr_date, opr_type, goods_no, goods_num) VALUES ('2003-01-01', 1, 3, 334); INSERT INTO ta (opr_date, opr_type, goods_no, goods_num) VALUES ('2003-01-01', 3, 2, 4);SELECT goods_no, sum(CASE opr_type WHEN 1 THEN goods_num WHEN 2 THEN - goods_num ELSE - goods_num END ) as goods_num FROM `ta` WHERE TO_DAYS(`opr_date`)>TO_DAYS('2003-01-02') GROUP BY `goods_no`;+----------+-----------+ | goods_no | goods_num | +----------+-----------+ | 1 | 31 | +----------+-----------+ 1 row in set (0.00 sec)因为 opr_type 的设置,所以可以用 IF(expr1,expr2,expr3) 来代替 CASE 以提高查询速度SELECT goods_no, sum(IF(opr_type = 1,goods_num,- goods_num) ) as goods_num FROM `ta` WHERE TO_DAYS(`opr_date`)>TO_DAYS('2003-01-02') GROUP BY `goods_no`;
真的No way了吗
江苏综艺台的
大陆新版,
挺不错的!前一次你提问题时
就觉的你的表结构设得有点不妥,
不知我这样建表行不行得通:tA (货物类型)
货物编号,货物名称,货物规格tB (货物库存)
货物编号,统计时间,货物数量 # 此表中的数据并不是实时数据
# 可以分天统计,每晚进行一次明细统计tC (交易)
交易单号,交易时间,交易类型
# 交易类型为 出库/入库
tD (交易详细)
交易单号,交易货物编号,货物交易数量
# 为了提高以后进行统计时的处理速度,
# 可以适当增加数据冗余度,增加两个字段,
# 交易类型 与 交易时间
对每样货品最好给它一个固定编号,
而不论需记录多少信息,
对于其它额外的信息你完全可以建立一个子表用于保存货物的其它属性
:》
但是,我的交易的记录是不是都要记在一张表上啊?还有现在我将问题转化成这样一个查询货物 单号ID 数量
---------------------
A 1 2
B 3 4
A 2 5按货物分组查找 同组内 最大单号ID 那条记录的 数量
`opr_date` date NOT NULL default '0000-00-00',
`opr_type` enum('入库','领料','退料') NOT NULL default '入库',
`goods_no` int(10) unsigned NOT NULL default '0',
`goods_num` int(10) unsigned NOT NULL default '0',
KEY `opr_date` (`opr_date`,`opr_type`,`goods_no`)
) TYPE=MyISAMINSERT INTO ta (opr_date, opr_type, goods_no, goods_num) VALUES ('2003-01-03', 1, 1, 34);
INSERT INTO ta (opr_date, opr_type, goods_no, goods_num) VALUES ('2003-01-04', 2, 1, 3);
INSERT INTO ta (opr_date, opr_type, goods_no, goods_num) VALUES ('2003-01-01', 1, 2, 34);
INSERT INTO ta (opr_date, opr_type, goods_no, goods_num) VALUES ('2003-01-01', 1, 3, 334);
INSERT INTO ta (opr_date, opr_type, goods_no, goods_num) VALUES ('2003-01-01', 3, 2, 4);SELECT goods_no,
sum(CASE opr_type WHEN 1 THEN goods_num
WHEN 2 THEN - goods_num
ELSE - goods_num END
) as goods_num
FROM `ta`
WHERE TO_DAYS(`opr_date`)>TO_DAYS('2003-01-02')
GROUP BY `goods_no`;+----------+-----------+
| goods_no | goods_num |
+----------+-----------+
| 1 | 31 |
+----------+-----------+
1 row in set (0.00 sec)因为 opr_type 的设置,所以可以用 IF(expr1,expr2,expr3) 来代替 CASE 以提高查询速度SELECT goods_no,
sum(IF(opr_type = 1,goods_num,- goods_num)
) as goods_num
FROM `ta`
WHERE TO_DAYS(`opr_date`)>TO_DAYS('2003-01-02')
GROUP BY `goods_no`;