Mysql table 旋转以比较同一年度和上一年的销售额 table
Mysql table Pivot to compare sales from current and previous year from the same table
我用不同年份的销售数据创建了 mysqltable。link to sql fiddle
我想在 table 中有一列,其中显示今年的销售额,另外一列显示去年的销售额总和,如图所示。
CREATE TABLE agreement (
Id INT NOT NULL,
supplier VARCHAR(25) NOT NULL,
sales VARCHAR(25) NOT NULL,
yearDate DATE NOT NULL,
yearx VARCHAR(10)
);
INSERT INTO agreement
(Id, supplier, sales, yeardate,yearx)
VALUES
('1', 'AB Foods', '2', '2020-01-01', '2020'),
('2', 'BC Foods', '2', '2020-01-01','2020'),
('11', 'AB Foods', '34', '2020-02-01', '2020'),
('22', 'BC Foods', '80', '2020-02-01','2020'),
('5', 'AB Foods', '5', '2021-01-03','2021'),
('6', 'BC Foods', '5', '2021-01-03','2021'),
('52', 'AB Foods', '51', '2021-02-03','2021'),
('16', 'BC Foods', '50', '2021-02-03','2021')
;
我解决问题的方法:
SELECT
supplier,
yearx,
sum(if(month(yearDate) = 1, sales, 0)) AS Jan,
sum(if(month(yearDate) = 2, sales, 0)) AS Feb,
sum(sales) AS Total_ThisYear,
sum(sales) AS Total_LaastYear
FROM agreement
GROUP BY supplier, yearx
order by yearx
但似乎我需要在 case 语句中添加一个 where 子句。
提前致谢
没有联接无法执行此操作。这可能是可行的解决方案:
SELECT
a.supplier,
a.yearx,
sum(if(month(a.yearDate) = 1, a.sales, 0)) AS Jan,
sum(if(month(a.yearDate) = 2, a.sales, 0)) AS Feb,
sum(a.sales) AS Total_ThisYear,
IFNULL(ls.sales, 0) AS Total_LaastYear
FROM agreement a
LEFT JOIN (
SELECT b.supplier, YEAR(b.yearDate) AS 'year', SUM(sales) AS 'sales' FROM agreement b
GROUP BY b.supplier, YEAR(b.yearDate)
) ls ON ls.supplier = a.supplier AND ls.year = yearx - 1
GROUP BY a.supplier, a.yearx
order by a.yearx
我用不同年份的销售数据创建了 mysqltable。link to sql fiddle
我想在 table 中有一列,其中显示今年的销售额,另外一列显示去年的销售额总和,如图所示。
CREATE TABLE agreement (
Id INT NOT NULL,
supplier VARCHAR(25) NOT NULL,
sales VARCHAR(25) NOT NULL,
yearDate DATE NOT NULL,
yearx VARCHAR(10)
);
INSERT INTO agreement
(Id, supplier, sales, yeardate,yearx)
VALUES
('1', 'AB Foods', '2', '2020-01-01', '2020'),
('2', 'BC Foods', '2', '2020-01-01','2020'),
('11', 'AB Foods', '34', '2020-02-01', '2020'),
('22', 'BC Foods', '80', '2020-02-01','2020'),
('5', 'AB Foods', '5', '2021-01-03','2021'),
('6', 'BC Foods', '5', '2021-01-03','2021'),
('52', 'AB Foods', '51', '2021-02-03','2021'),
('16', 'BC Foods', '50', '2021-02-03','2021')
;
我解决问题的方法:
SELECT
supplier,
yearx,
sum(if(month(yearDate) = 1, sales, 0)) AS Jan,
sum(if(month(yearDate) = 2, sales, 0)) AS Feb,
sum(sales) AS Total_ThisYear,
sum(sales) AS Total_LaastYear
FROM agreement
GROUP BY supplier, yearx
order by yearx
但似乎我需要在 case 语句中添加一个 where 子句。
提前致谢
没有联接无法执行此操作。这可能是可行的解决方案:
SELECT
a.supplier,
a.yearx,
sum(if(month(a.yearDate) = 1, a.sales, 0)) AS Jan,
sum(if(month(a.yearDate) = 2, a.sales, 0)) AS Feb,
sum(a.sales) AS Total_ThisYear,
IFNULL(ls.sales, 0) AS Total_LaastYear
FROM agreement a
LEFT JOIN (
SELECT b.supplier, YEAR(b.yearDate) AS 'year', SUM(sales) AS 'sales' FROM agreement b
GROUP BY b.supplier, YEAR(b.yearDate)
) ls ON ls.supplier = a.supplier AND ls.year = yearx - 1
GROUP BY a.supplier, a.yearx
order by a.yearx