MYSQL 计算同比 环比 并按月统计

xiao_maoqiu 2017-06-01 03:35:41
我目前写出来的只能统计一段时间内的总统计量,以及同比,环比。怎么能让它按月统计呢? 求大神

select t1.*,
CONCAT(CASE WHEN t2.totalTransaction = 0 OR t2.totalTransaction IS NULL
THEN 0
ELSE ((t1.totalTransaction-t2.totalTransaction) / t2.totalTransaction) * 100 END , '%') AS totalTransactionProportionT,
CONCAT(CASE WHEN t3.totalTransaction = 0 OR t3.totalTransaction IS NULL
THEN 0
ELSE ((t1.totalTransaction-t3.totalTransaction) / t3.totalTransaction) * 100 END , '%') AS totalTransactionProportionH,

CONCAT(CASE WHEN t2.totalVolumes = 0 OR t2.totalVolumes IS NULL
THEN 0
ELSE ((t1.totalVolumes-t2.totalVolumes) / t2.totalVolumes) * 100 END , '%') AS totalVolumesProportionT,
CONCAT(CASE WHEN t3.totalVolumes = 0 OR t3.totalVolumes IS NULL
THEN 0
ELSE ((t1.totalVolumes-t3.totalVolumes) / t3.totalVolumes) * 100 END , '%') AS totalVolumesProportionH,

CONCAT(CASE WHEN t2.totalTransactionMoney = 0 OR t2.totalTransactionMoney IS NULL
THEN 0
ELSE ((t1.totalTransactionMoney-t2.totalTransactionMoney) / t2.totalTransactionMoney) * 100 END , '%') AS totalTransactionMoneyProportionT,
CONCAT(CASE WHEN t3.totalTransactionMoney = 0 OR t3.totalTransactionMoney IS NULL
THEN 0
ELSE ((t1.totalTransactionMoney-t3.totalTransactionMoney) / t3.totalTransactionMoney) * 100 END , '%') AS totalTransactionMoneyProportionH,

CONCAT(CASE WHEN t2.totalVolumesMoney = 0 OR t2.totalVolumesMoney IS NULL
THEN 0
ELSE ((t1.totalVolumesMoney-t2.totalVolumesMoney) / t2.totalVolumesMoney) * 100 END , '%') AS totalVolumesMoneyProportionT,
CONCAT(CASE WHEN t3.totalVolumesMoney = 0 OR t3.totalVolumesMoney IS NULL
THEN 0
ELSE ((t1.totalVolumesMoney-t3.totalVolumesMoney) / t3.totalVolumesMoney) * 100 END , '%') AS totalVolumesMoneyProportionH
from
(select
DATE_FORMAT(price.end_time,'%Y-%m') as yearMonth,
sum(item.TRADING_WEIGHT) as totalTransaction,
sum(case when price.state = "6" then item.TRADING_WEIGHT else 0 end) as totalVolumes,
sum(case when batch.OFFER_TYPE = "2" then price.STARTING_PIRCE else (price.STARTING_PIRCE * item.TRADING_WEIGHT) end) as totalTransactionMoney,
sum(case when price.state = "6" then
case batch.OFFER_TYPE when "2" then price.STARTING_PIRCE
when "1" then (price.STARTING_PIRCE * item.TRADING_WEIGHT) end
else 0 end) as totalVolumesMoney,
sum(case when price.state = "6" then
case batch.OFFER_TYPE when "2" then (price.CURRENT_PRICE - price.STARTING_PIRCE)
when "1" then (item.TRADING_WEIGHT * (price.CURRENT_PRICE - price.STARTING_PIRCE)) end
else 0 end) as increasePrice,
sum(case when price.state = "7" then item.TRADING_WEIGHT else 0 end) as totalAbortive
from bdt_resources_item item,bdt_price_info price,bdt_batch batch
where
batch.id = price.batch_id and
item.id = price.item_id and
price.state in ("6","7") and
price.end_time >='2017-04-01' and
price.end_time <='2017-07-01') as t1,
(select
sum(item2.TRADING_WEIGHT) as totalTransaction,
sum(case when price2.state = "6" then item2.TRADING_WEIGHT else 0 end) as totalVolumes,
sum(case when batch2.OFFER_TYPE = "2" then price2.STARTING_PIRCE else (price2.STARTING_PIRCE * item2.TRADING_WEIGHT) end) as totalTransactionMoney,
sum(case when price2.state = "6" then
case batch2.OFFER_TYPE when "2" then price2.STARTING_PIRCE
when "1" then (price2.STARTING_PIRCE * item2.TRADING_WEIGHT) end
else 0 end) as totalVolumesMoney
from bdt_resources_item item2,bdt_price_info price2,bdt_batch batch2
where
batch2.id = price2.batch_id and
item2.id = price2.item_id and
price2.state in ("6","7") and
price2.end_time >=DATE_SUB('2017-04-01',INTERVAL 1 YEAR) and
price2.end_time <= DATE_SUB('2017-07-01',INTERVAL 1 YEAR)) as t2,
(select
sum(item3.TRADING_WEIGHT) as totalTransaction,
sum(case when price3.state = "6" then item3.TRADING_WEIGHT else 0 end) as totalVolumes,
sum(case when batch3.OFFER_TYPE = "2" then price3.STARTING_PIRCE else (price3.STARTING_PIRCE * item3.TRADING_WEIGHT) end) as totalTransactionMoney,
sum(case when price3.state = "6" then
case batch3.OFFER_TYPE when "2" then price3.STARTING_PIRCE
when "1" then (price3.STARTING_PIRCE * item3.TRADING_WEIGHT) end
else 0 end) as totalVolumesMoney
from bdt_resources_item item3,bdt_price_info price3,bdt_batch batch3
where
batch3.id = price3.batch_id and
item3.id = price3.item_id and
price3.state in ("6","7") and
price3.end_time >=DATE_SUB('2017-04-01',INTERVAL 1 MONTH) and
price3.end_time <= DATE_SUB('2017-07-01',INTERVAL 1 MONTH)) as t3
...全文
2391 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiao_maoqiu 2017-06-01
  • 打赏
  • 举报
回复
我现在查询出的结果是
+-----------+------------------+--------------+-----------------------+-------------------+---------------+---------------+-----------------------------+-----------------------------+-------------------------+-------------------------+----------------------------------+----------------------------------+------------------------------+------------------------------+
| yearMonth | totalTransaction | totalVolumes | totalTransactionMoney | totalVolumesMoney | increasePrice | totalAbortive | totalTransactionProportionT | totalTransactionProportionH | totalVolumesProportionT | totalVolumesProportionH | totalTransactionMoneyProportionT | totalTransactionMoneyProportionH | totalVolumesMoneyProportionT | totalVolumesMoneyProportionH |
+-----------+------------------+--------------+-----------------------+-------------------+---------------+---------------+-----------------------------+-----------------------------+-------------------------+-------------------------+----------------------------------+----------------------------------+------------------------------+------------------------------+
| 2017-06   | 11324.0000       | 5716.0000    | 14768439.000000       | 7376661.000000    | 718291.000000 | 5608.0000     | 0%                          | 4.25336034%                 | 0%                      | 4.21148587%             | 0%                               | 0.0016657420%                    | 0%                           | 0.0016674489%                |
+-----------+------------------+--------------+-----------------------+-------------------+---------------+---------------+-----------------------------+-----------------------------+-------------------------+-------------------------+----------------------------------+----------------------------------+------------------------------+------------------------------+
1 row in set
想要的结果类似于是这样的 把时间段内的月份都展示出来,如果没有则为0,按月统计而不是统计时间段内的所有金额
+-----------+------------------+--------------+-----------------------+-------------------+---------------+---------------+-----------------------------+-----------------------------+-------------------------+-------------------------+----------------------------------+----------------------------------+------------------------------+------------------------------+
| yearMonth | totalTransaction | totalVolumes | totalTransactionMoney | totalVolumesMoney | increasePrice | totalAbortive | totalTransactionProportionT | totalTransactionProportionH | totalVolumesProportionT | totalVolumesProportionH | totalTransactionMoneyProportionT | totalTransactionMoneyProportionH | totalVolumesMoneyProportionT | totalVolumesMoneyProportionH |
+-----------+------------------+--------------+-----------------------+-------------------+---------------+---------------+-----------------------------+-----------------------------+-------------------------+-------------------------+----------------------------------+----------------------------------+------------------------------+------------------------------+
| 2017-05   | 6369.0000        | 3123.0000    | 1457955.000000        | 721413.000000     | 718290.000000 | 3246.0000     | 41.75383931%                | 0.00000000%                 | 32.21845893%            | 0.00000000%             | -89.0463641597%                  | 0.0000000000%                    | -89.1600383163%              | 0.0000000000%                |
| 2017-06   | 462.0000         | 231.0000     | 246.000000            | 123.000000        | 1.000000      | 231.0000      | -89.71733808%               | -92.74611399%               | -90.22015241%           | -92.60326609%           | -99.9981517986%                  | -99.9831270512%                  | -99.9981518003%              | -99.9829501270%              |
+-----------+------------------+--------------+-----------------------+-------------------+---------------+---------------+-----------------------------+-----------------------------+-------------------------+-------------------------+----------------------------------+----------------------------------+------------------------------+------------------------------+
2 rows in set
xiao_maoqiu 2017-06-01
  • 打赏
  • 举报
回复
引用 1 楼 ACMAIN_CHM 的回复:
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。 参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382 1. 你的 create table xxx .. 语句 2. 你的 insert into xxx ... 语句 3. 结果是什么样,(并给以简单的算法描述) 4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL) 这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
好的,谢谢版主提醒。数据库是mysql 5.0 结果算法主要是计算同比,环比 我的表主要是是三张表

-- ----------------------------
-- Table structure for `bdt_batch`
-- ----------------------------
DROP TABLE IF EXISTS `bdt_batch`;
CREATE TABLE `bdt_batch` (
  `ID` varchar(30) NOT NULL COMMENT '主键(PM200600001)',
  `BATCH_NAME` varchar(100) DEFAULT NULL COMMENT '场次名称',
  `MEMBER_NAME` varchar(30) DEFAULT NULL COMMENT '会员名称',
  `MEMBER_CODE` varchar(30) NOT NULL COMMENT '发起竞价的会员代码',
  `BATCH_STATE` varchar(2) NOT NULL COMMENT '委托状态:0-已生成,1-已发布,2.竞价中 3-已撤消,4--已作废,5-已完成',
  `BATCH_DATE` datetime NOT NULL COMMENT '委托申请时间',
  `END_TIME` datetime NOT NULL COMMENT '结束时间',
  `START_TIME` datetime NOT NULL COMMENT '开始时间',
  `BOND_PAYMENT_STATUS` varchar(2) DEFAULT NULL COMMENT '履约保证金是否已经支付 1 - 已经支付 0 - 未支付(只有此状态为1才允许开始拍卖)',
  `SETTLEMENT_MODE` varchar(2) DEFAULT NULL COMMENT '结算方式:1-场外结算(默认) 2- 场内结算',
  `INVALID_DATE` datetime DEFAULT NULL COMMENT '作废时间',
  `AUDIT_OPERATOR` varchar(30) DEFAULT NULL COMMENT '审核操作员',
  `STOP_OPERATOR` varchar(30) DEFAULT NULL COMMENT '终止操作员',
  `INVALID_OPERATOR` varchar(30) DEFAULT NULL COMMENT '作废操作员',
  `APPLY_OPERATOR` varchar(30) DEFAULT NULL COMMENT '申请操作员',
  `ANNOUNCEMENT_DAY` datetime DEFAULT NULL COMMENT '公告日',
  `BID_DAY` datetime DEFAULT NULL COMMENT '竞价日',
  `BUYER_DEPOSIT` decimal(20,2) DEFAULT NULL COMMENT '买方保证金',
  `SELLER_BOND` decimal(20,2) DEFAULT NULL COMMENT '卖家保证金',
  `FORCED_TERMINATION_REASON` varchar(200) DEFAULT NULL COMMENT '强制终止理由',
  `AUDIT_STOP_REASON` varchar(200) DEFAULT NULL COMMENT '终止委托审核理由(待定)',
  `AUDIT_STOP_DATE` datetime DEFAULT NULL COMMENT '终止委托审核时间(待定)',
  `APPLY_STOP_REASON` varchar(200) DEFAULT NULL COMMENT '终止委托申请理由(待定)',
  `APPLY_STOP_DATE` datetime DEFAULT NULL COMMENT '终止委托申请时间(待定)',
  `REFUSE_AUDIT_REASON` varchar(200) DEFAULT NULL COMMENT '拒绝审核委托理由(待定)',
  `AUDIT_TIME` datetime DEFAULT NULL COMMENT '委托审核时间(待定)',
  `IS_DIRECTIONAL_BID` varchar(2) DEFAULT NULL COMMENT '定向竞价 0定向 1非定向',
  `DIRECTIONAL_REASON` varchar(200) DEFAULT NULL COMMENT '定向的原因,当场次定向时必须输入',
  `IS_SEND_MESSAGE` varchar(2) DEFAULT NULL COMMENT '是否需要发送短信0不发送1发送',
  `IS_SHOW_DEAL_PRICE` varchar(2) DEFAULT NULL COMMENT '是否显示中标价格',
  `IS_SHOW_ORDER_PRICE` varchar(2) DEFAULT NULL COMMENT '是否显示定价',
  `IS_SHOW_DEAL_MEMBER` varchar(2) DEFAULT NULL COMMENT '是否显示中标会员',
  `MINIMUM_RESPONSE` varchar(30) DEFAULT NULL COMMENT '最少响应人数',
  `ISSHOWDEALRESULT` varchar(2) DEFAULT NULL COMMENT '是否显示成交结果',
  `BIDDING_TYPE` varchar(2) NOT NULL DEFAULT '1' COMMENT '竞价模式:1-公开增价,2自由报价,3-荷式竞价',
  `OFFER_TYPE` varchar(2) NOT NULL DEFAULT '2' COMMENT '报盘方式:1-单价,2-总价',
  `EDITMENT` longtext COMMENT '协议',
  `IS_SHOW_STARTING_PIRCE` varchar(2) DEFAULT NULL COMMENT '是否显示起拍价 1显示(默认) 2不显示 ',
  `DOAMIN` varchar(10) DEFAULT 'HGB' COMMENT '域名',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of bdt_batch
-- ----------------------------
INSERT INTO `bdt_batch` VALUES ('P170508004', '32', 'member2', 'U1234', '0', '2017-05-08 13:53:35', '2017-05-08 15:55:00', '2017-05-08 13:55:00', null, '1', null, null, null, null, null, '2017-05-08 00:00:00', '2017-05-08 00:00:00', '12.00', null, null, null, null, null, null, null, null, '1', '', null, null, null, null, '2', null, '1', '2', '', '1', 'HGB');
INSERT INTO `bdt_batch` VALUES ('P170508005', '32', 'member1', 'U1234', '0', '2017-05-08 14:38:12', '2017-05-08 15:55:00', '2017-05-08 13:55:00', null, '1', null, null, null, null, null, '2017-05-08 00:00:00', '2017-05-08 00:00:00', '12.00', null, null, null, null, null, null, null, null, '1', '', null, null, null, null, '2', null, '1', '2', '', '1', 'HGB');
-- ----------------------------
-- Table structure for `bdt_price_info`
-- ----------------------------
DROP TABLE IF EXISTS `bdt_price_info`;
CREATE TABLE `bdt_price_info` (
  `ID` varchar(30) NOT NULL COMMENT 'ID',
  `BATCH_ID` varchar(30) DEFAULT NULL COMMENT '场次ID',
  `ITEM_ID` int(11) DEFAULT NULL COMMENT '物资号',
  `BUYER_DEPOSIT` decimal(20,2) DEFAULT NULL COMMENT '卖家保证金',
  `BIDDING_GRADIENT` decimal(20,2) DEFAULT NULL COMMENT '报价梯度/降价梯度',
  `STARTING_PIRCE` decimal(20,2) NOT NULL COMMENT '起拍价(若为总价报盘,则为总价,否则为单价)',
  `MIN_PIRCE` decimal(20,2) DEFAULT NULL COMMENT '销售底价(若为总价报盘,则为总价,否则为单价)',
  `SHOW_PIRCE` varchar(2) DEFAULT '1' COMMENT '是否显示底价:1-显示,2-不显示',
  `STATE` varchar(2) DEFAULT '0' COMMENT '竞价状态:0-已生成,1-已发布,2.竞价中 3-已撤消,4--已作废 5已结束6已成交7已流标',
  `START_TIME` datetime DEFAULT NULL COMMENT '开始时间',
  `END_TIME` datetime DEFAULT NULL COMMENT '结束时间',
  `WINNING_USER` varchar(30) DEFAULT NULL COMMENT '中标会员',
  `WINNING_CONTRACT` varchar(30) DEFAULT NULL COMMENT '中标合同号',
  `WINNING_DATE` datetime DEFAULT NULL COMMENT '中标时间',
  `TOTAL_PRICE` decimal(20,2) DEFAULT NULL COMMENT '出价金额(总价)',
  `REMARK` varchar(200) DEFAULT NULL COMMENT '备注:流标因为',
  `TOTAL_NUMBER` decimal(18,4) DEFAULT NULL COMMENT '中标数量',
  `FLOW_INFO` varchar(2) NOT NULL DEFAULT '0' COMMENT '流标原因:0未流标1响应人数不足2无人出价3未到保留价',
  `CURRENT_PRICE` decimal(16,2) DEFAULT NULL COMMENT '当前价',
  `UNIT_PRICE` decimal(18,2) DEFAULT NULL COMMENT '拼盘单价',
  `IS_SHOW_CURPRICE` varchar(2) DEFAULT NULL COMMENT '是否启用显示最新价格(1显示0不显示)',
  `BUY_RATE` decimal(18,8) DEFAULT NULL COMMENT '买家服务费率',
  `SELL_RATE` decimal(18,8) DEFAULT NULL COMMENT '卖家服务费率',
  `SETTLEMENT_UNIT` varchar(30) DEFAULT NULL COMMENT '结算公司',
  `MIN_WEIGHT` decimal(18,4) DEFAULT NULL COMMENT '最小起拍量(荷式拍卖)',
  `DOWN_PRICE_INTERVAL` int(11) DEFAULT NULL COMMENT '降价间隔时间(荷式拍卖)',
  `IS_SHOW_TRANSACTION_PRICE` varchar(2) DEFAULT NULL COMMENT '是否显示成交价',
  `RESERVE_PRICE` decimal(18,2) DEFAULT NULL COMMENT '保留价',
  `TAX_RATE` decimal(10,4) DEFAULT NULL COMMENT '税率',
  `TAX_FREE_PRICE` decimal(10,4) DEFAULT NULL COMMENT '不含税价',
  `DOAMIN` varchar(10) DEFAULT 'HGB' COMMENT '域名',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of bdt_price_info
-- ----------------------------
INSERT INTO `bdt_price_info` VALUES ('P170508004001', 'P170508004', '23', null, '61.50', '123.00', null, '1', '6', '2017-05-08 13:55:00', '2017-06-08 15:55:00', 'U34663', null, null, null, null, null, '0', '124.00', null, null, null, null, null, null, null, null, '123.00', '13.0000', '107.0100', 'HGB');
INSERT INTO `bdt_price_info` VALUES ('P170508005001', 'P170508005', '24', null, '61.50', '123.00', null, '1', '7', '2017-05-08 13:55:00', '2017-06-21 15:57:00', 'U34663', null, null, null, null, null, '0', '124.00', null, null, null, null, null, null, null, null, '123.00', '13.0000', '107.0100', 'HGB');
INSERT INTO `bdt_price_info` VALUES ('P170508005002', 'P170508005', '25', null, '12.00', '12.00', null, '1', '6', '2017-05-08 13:55:00', '2016-05-08 15:55:00', 'U34663', null, null, null, null, null, '0', null, null, null, null, null, null, null, null, null, '123.00', '123.0000', '107.0100', 'HGB');
-- ----------------------------
-- Table structure for `bdt_resources_item`
-- ----------------------------
DROP TABLE IF EXISTS `bdt_resources_item`;
CREATE TABLE `bdt_resources_item` (
  `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '物资号',
  `PRICE_INFO_ID` varchar(30) DEFAULT NULL COMMENT '拼盘号',
  `BATCH_ID` varchar(30) DEFAULT NULL COMMENT '场次ID',
  `PACKAGES` varchar(30) DEFAULT NULL COMMENT '材质(包装)',
  `PRODUCT_NAME` varchar(30) DEFAULT NULL COMMENT '品名',
  `PRODUCT_CODE` varchar(30) DEFAULT NULL COMMENT '品名代码',
  `RATE` decimal(10,4) DEFAULT NULL COMMENT '品名费率',
  `SPECIFICATION` varchar(30) DEFAULT NULL COMMENT '规格(质量标准)',
  `ORIGIN_PLACE` varchar(30) DEFAULT NULL COMMENT '产地',
  `PIECE_UNIT` varchar(10) DEFAULT NULL COMMENT '计量单位',
  `TRADING_QUANTITY` decimal(18,4) DEFAULT NULL COMMENT '交易数量',
  `TRADING_WEIGHT` decimal(18,4) DEFAULT NULL COMMENT '交易重量',
  `WAREHOUSE_NAME` varchar(30) DEFAULT NULL COMMENT '仓库',
  `REMARKS` varchar(100) DEFAULT NULL COMMENT '备注',
  `PAYMENT_METHOD` varchar(30) DEFAULT NULL COMMENT '付款方式',
  `DELIVERY_METHOD` varchar(30) DEFAULT NULL COMMENT '提货方式',
  `DELIVERY_DATE` varchar(30) DEFAULT NULL COMMENT '交货时间',
  `ATTACH_ID` int(30) DEFAULT NULL COMMENT '附件ID',
  `WAREHOUSE_LOCATION` varchar(30) DEFAULT NULL COMMENT '仓库所在地',
  `PRODUCT_NO` varchar(30) DEFAULT NULL COMMENT '产品代码',
  `DOAMIN` varchar(10) DEFAULT 'HGB' COMMENT '域名',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=131 DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of bdt_resources_item
-- ----------------------------
INSERT INTO `bdt_resources_item` VALUES ('23', 'P170508004001', 'P170508004', '23', '品名6', 'code6', null, '123', '321', '吨', null, '231.0000', '321', '312', '现汇', '自提', null, null, null, null, 'HGB');
INSERT INTO `bdt_resources_item` VALUES ('24', 'P170508005001', 'P170508005', '23', '品名6', 'code6', null, '123', '321', '吨', null, '231.0000', '321', '312', '现汇', '自提', null, null, null, null, 'HGB');
INSERT INTO `bdt_resources_item` VALUES ('25', 'P170508005002', 'P170508005', '22', '品名6', 'code6', null, '123', '213', '吨', null, '231.0000', '213', '123', null, null, null, null, null, null, 'HGB');
ACMAIN_CHM 2017-06-01
  • 打赏
  • 举报
回复
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。 参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382 1. 你的 create table xxx .. 语句 2. 你的 insert into xxx ... 语句 3. 结果是什么样,(并给以简单的算法描述) 4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL) 这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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