如何在mysql中获取每个月的汇总数据

如何在mysql中获取每个月的汇总数据,mysql,Mysql,我想计算每个项目每月售出的项目数量(项目数量) -- -- Table structure for table `sales` -- CREATE TABLE `sales` ( `id` int(11) NOT NULL, `item_id` int(11) NOT NULL, `date` date NOT NULL, `item_count` int(11) NOT NULL, `amount` float NOT NULL ) ENGINE=InnoDB DEFAUL

我想计算每个项目每月售出的项目数量(项目数量)

--
-- Table structure for table `sales`
--
CREATE TABLE `sales` (
  `id` int(11) NOT NULL,
  `item_id` int(11) NOT NULL,
  `date` date NOT NULL,
  `item_count` int(11) NOT NULL,
  `amount` float NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `sales`
--

INSERT INTO `sales` (`id`, `item_id`, `date`, `item_count`, `amount`)     VALUES
(1, 1, '2018-01-15', 11, 110),
(2, 2, '2018-01-21', 5, 1000),
(3, 1, '2018-02-02', 7, 700),
(4, 2, '2018-02-11', 3, 3000);
我尝试过这个SQL,但是它没有正确显示数据

SELECT `sales`.`item_id`,
(CASE WHEN MONTH(sales.date)=1 THEN sum(sales.item_count) ELSE NULL END) as JAN,
(case when MONTH(sales.date)=2 THEN sum(sales.item_count) ELSE NULL END) as FEB 
FROM sales WHERE 1
GROUP BY sales.item_id
ORDER BY sales.item_id
这是我预期的结果

item_id  JAN  FEB
1        11   7
2        5    3
我明白了

item_id  JAN  FEB
1        18   NULL
2        8    NULL

下面是对您的查询的即时修复。您需要对
大小写
表达式求和,而不是相反

SELECT
    s.item_id,
    SUM(CASE WHEN MONTH(s.date) = 1 THEN s.item_count END) AS JAN,
    SUM(CASE WHEN MONTH(s.date) = 2 THEN s.item_count END) AS FEB
FROM sales s
GROUP BY
    s.item_id
ORDER BY
    s.item_id;
但是这个查询的潜在问题是为了支持更多的月份,您需要添加更多的列。此外,如果您想覆盖多年,那么这种方法也可能无法扩展。假设您只有几个项目,下面是另一种方法:

SELECT
    DATE_FORMAT(date, '%Y-%m') AS ym,
    SUM(CASE WHEN item_id = 1 THEN item_count END) AS item1_total,
    SUM(CASE WHEN item_id = 2 THEN item_count END) AS item2_total
FROM sales
GROUP BY
    DATE_FORMAT(date, '%Y-%m');
这将生成类似以下内容的输出:

ym       item1_total  item2_total
2018-01  11           5
2018-02  7            3

您使用哪个版本取决于您的报告需要多少个月,以及您的数据中可能出现多少项。

以下是您的查询的即时解决方案。您需要对
大小写
表达式求和,而不是相反

SELECT
    s.item_id,
    SUM(CASE WHEN MONTH(s.date) = 1 THEN s.item_count END) AS JAN,
    SUM(CASE WHEN MONTH(s.date) = 2 THEN s.item_count END) AS FEB
FROM sales s
GROUP BY
    s.item_id
ORDER BY
    s.item_id;
但是这个查询的潜在问题是为了支持更多的月份,您需要添加更多的列。此外,如果您想覆盖多年,那么这种方法也可能无法扩展。假设您只有几个项目,下面是另一种方法:

SELECT
    DATE_FORMAT(date, '%Y-%m') AS ym,
    SUM(CASE WHEN item_id = 1 THEN item_count END) AS item1_total,
    SUM(CASE WHEN item_id = 2 THEN item_count END) AS item2_total
FROM sales
GROUP BY
    DATE_FORMAT(date, '%Y-%m');
这将生成类似以下内容的输出:

ym       item1_total  item2_total
2018-01  11           5
2018-02  7            3

您使用哪个版本取决于您的报告需要多少个月,以及您的数据中可能出现多少项。

事实上,我需要在1月至12月期间为每个项目提供该版本,我只使用了两个月作为示例。所以你的第一个建议对我有效:)事实上,我需要它1月至12月的每一个项目,我只是用了两个月的样品。所以你的第一个建议对我有用:)