如何在mysql中获取每个月的摘要数据

时间:2019-01-19 10:22:22

标签: mysql

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

--
-- 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

1 个答案:

答案 0 :(得分:2)

这是您查询的立即修复。您需要对CASE表达式求和,而不是相反。

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

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