补充:count(1)和count(*)基本没有差别!可以在网上搜索下.
原题:
其中:s1_id为仓库1的库存量,s2_id为仓库2的库存量,s3_id为仓库3的库存量。如果该产品在某仓库中无库存量,那么就是0代替。
OK,现在到MySQL进行表的建立:
-- ---------------------------- -- Table structure for `a` -- ---------------------------- DROP TABLE IF EXISTS `a`; CREATE TABLE `a` ( `p_id` int(11) DEFAULT NULL, `p_num` int(11) DEFAULT NULL, `s_id` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of a -- ---------------------------- INSERT INTO `a` VALUES ('1', '10', '1'); INSERT INTO `a` VALUES ('1', '12', '2'); INSERT INTO `a` VALUES ('2', '8', '1'); INSERT INTO `a` VALUES ('3', '11', '1'); INSERT INTO `a` VALUES ('3', '8', '3');
正确的SQL语句如下:
select p_id, sum(case s_id when 1 then p_num else 0 end) as s1_id, sum(case s_id when 2 then p_num else 0 end) as s2_id, sum(case s_id when 3 then p_num else 0 end) as s3_id from A group by p_id
思路:擦,其实就是个简单的行转列.不过是加了个sum和group by.(PS:数据库默认关键字是大小写,不过我是先在txt上敲的).理解SQL执行顺序很重要.
DROP TABLE IF EXISTS `b`; CREATE TABLE `b` ( `企业名称` varchar(255) DEFAULT NULL, `欠费金额` int(11) DEFAULT NULL, `是否欠费` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of b -- ---------------------------- INSERT INTO `b` VALUES ('a', '120', 'n'); INSERT INTO `b` VALUES ('b', '120', 'y'); INSERT INTO `b` VALUES ('c', '60', 'n'); INSERT INTO `b` VALUES ('a', '120', 'y'); INSERT INTO `b` VALUES ('a', '120', 'y'); INSERT INTO `b` VALUES ('b', '120', 'n');
表图如左,要求如右
select temp.企业名称,temp.应缴金额,temp.实缴金额,temp.欠缴金额, (case when temp.欠缴金额>0 then "欠费" else "没欠" end)as "是否欠费" from( select 企业名称, sum(欠费金额) as "应缴金额", sum(case 是否欠费 when "N" then 欠费金额 else 0 end) as "实缴金额", sum(case 是否欠费 when "Y" then 欠费金额 else 0 end) as "欠缴金额" from b group by 企业名称 )temp
PS:好吧,我很可耻的偷懒了,列名都搞中文的...........
select 企业名称, sum(欠费金额) as "应缴金额", sum(case 是否欠费 when "N" then 欠费金额 else 0 end) as "实缴金额", sum(case 是否欠费 when "Y" then 欠费金额 else 0 end) as "欠缴金额" from b group by 企业名称
DROP TABLE IF EXISTS `first`; CREATE TABLE `first` ( `id` int(11) DEFAULT NULL, `startTime` date DEFAULT NULL, `endTime` date DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of first -- ---------------------------- INSERT INTO `first` VALUES ('1', '2007-01-02', '2007-01-03'); INSERT INTO `first` VALUES ('1', '2007-01-05', '2007-01-06'); INSERT INTO `first` VALUES ('1', '2007-01-09', '2007-01-13'); INSERT INTO `first` VALUES ('2', '2007-02-02', '2007-02-03'); INSERT INTO `first` VALUES ('3', '2007-04-02', '2007-04-03'); -- ---------------------------- -- Table structure for `second` -- ---------------------------- DROP TABLE IF EXISTS `second`; CREATE TABLE `second` ( `id` int(11) DEFAULT NULL, `createTime` date DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of second -- ---------------------------- INSERT INTO `second` VALUES ('1', '2007-01-02'); INSERT INTO `second` VALUES ('1', '2007-01-05'); INSERT INTO `second` VALUES ('1', '2007-01-03'); INSERT INTO `second` VALUES ('3', '2007-04-02'); INSERT INTO `second` VALUES ('1', '2007-01-04'); INSERT INTO `second` VALUES ('1', '2007-01-02'); INSERT INTO `second` VALUES ('2', '2007-02-02');
如图:
select f.id,f.startTime,f.endTime, (select count(*) from second as s WHERE f.id=s.id and s.createTime BETWEEN f.startTime AND f.endTime ) AS '次数' from first as f
select f.id,f.startTime,f.endTime, IFNULL((select count(*) from second as s WHERE f.id=s.id and s.createTime BETWEEN f.startTime AND f.endTime GROUP BY f.id,f.startTime,f.endTime ),0)AS '次数' from first as f
OK,三道题完成.