如何在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月的每一个项目,我只是用了两个月的样品。所以你的第一个建议对我有用:)