【问题标题】:Mysql: Count of orders based on reason,historical status and current statusMysql:基于原因,历史状态和当前状态的订单计数
【发布时间】:2013-05-09 14:08:48
【问题描述】:

我想根据那里的历史状态和原因计算订单数和收入总和。

以下是我的表结构。

订单表:-

CREATE TABLE `order_item` (
  `id_order_item` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `unit_price` decimal(17,2) DEFAULT NULL,
  `fk_reason` int(11) DEFAULT NULL,
  PRIMARY KEY (`id_order_item`),
  KEY `fk_reason` (`fk_reason`)
) ENGINE=InnoDB;

历史表:-

CREATE TABLE `order_item_status_history` (
  `id_order_item_status_history` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `fk_order_item` int(10) unsigned NOT NULL,
  `fk_order_item_status` int(10) unsigned NOT NULL COMMENT ''New status'',
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `created_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id_order_item_status_history`),
  KEY `fk_order_item` (`fk_order_item`),
  CONSTRAINT `order_item_status_history_ibfk_1` FOREIGN KEY (`fk_order_item`) REFERENCES `order_item` (`id_order_item`) ON DELETE CASCADE ON UPDATE NO ACTION,
  CONSTRAINT `order_item_status_history_ibfk_3` FOREIGN KEY (`fk_order_item_status`) REFERENCES `order_item_status` (`id_order_item_status`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB;

状态表:-

CREATE TABLE `order_item_status` (
  `id_order_item_status` int(10) unsigned NOT NULL,
  `name` varchar(50) NOT NULL,
  `desc` varchar(255) NOT NULL,
  `deprecated` tinyint(1) DEFAULT ''0'',
  PRIMARY KEY (`id_order_item_status`),
) ENGINE=InnoDB;

原因表:-

CREATE TABLE `reason` (
  `id_reason` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `desc` varchar(255) NOT NULL,
  PRIMARY KEY (`id_cancel_reason`),
) ENGINE=InnoDB ;

我需要将订单分组到以下存储桶中,

  1. 订单状态为“已关闭”,如果订单之前已发货。(即 之前的订单状态为“已发货”)
  2. 订单状态为“已关闭”,如果之前未发货(即之前的订单状态不是“已发货”) (在这种情况下需要检查当前状态以及之前的订单状态。)
  3. 订单状态为“欺诈” (在这种情况下只需要检查当前状态。) ......

如何根据上面定义的存储桶获取计数或订单以及收入。 我在计算第 3 点和第 4 点的订单并在单个查询中获取所有计数时遇到问题。

【问题讨论】:

  • 你的问题真的很难理解。如果您能展示您尝试过的内容以及一些示例数据和所需的结果,将会有所帮助。哦,还有第 4 点。

标签: mysql sql


【解决方案1】:

要将所有这些都集中到一个查询中,您可以像这样使用CASE WHEN ..

SELECT
whateverYouAreGroupingByIfNeeded,
SUM(CASE WHEN status = 'canceled' AND reason = 1 THEN 1 ELSE 0 END) AS count_whatever
SUM(CASE WHEN whatever = true THEN whateverYouWantToSummarize ELSE NULL END) AS sum_whatever
FROM yourTable
GROUP BY whatever

当您需要具体帮助时,最好展示您的尝试。

P.S.:如果您在加入时遇到问题,请阅读this.

【讨论】:

  • 我的连接没有问题,我可以计算 1 和 2 点我的问题是 3 点和 4 点,并将所有计数的结果结合在一起。
猜你喜欢
  • 2019-04-07
  • 2018-10-10
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 2010-09-15
相关资源
最近更新 更多