【问题标题】:Mysql table Pivot to compare sales from current and previous year from the same tableMysql table Pivot 比较同一张表中当前和上一年的销售额
【发布时间】:2021-05-29 06:34:55
【问题描述】:

我用不同年份的销售数据创建了mysqltable。link to sql fiddle

我想在表格中有一列显示今年的销售额,另外一列显示去年的销售额总和,如图所示。

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')
    
;

SQL Fiddle example

我解决问题的方法:

    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 子句。

提前谢谢你

【问题讨论】:

  • 您可以发布您的查询吗?
  • @Strawberry 它包含在上面已经提到的链接中sqlfiddle.com/#!9/9ce3aa/4
  • 考虑处理应用代码中数据显示的问题

标签: mysql join html-table phpmyadmin pivot-table


【解决方案1】:

没有加入就无法做到这一点。这可能是有效的解决方案:

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

【讨论】:

  • 非常感谢您的帮助。有用。我想知道为了比较比当前月份少的月份的销售额与去年的销售额。例如 ThisYearSales VS LastyearSale (直到当前月份为 2) 。这是正确的方法吗: ls.month
  • 是的 - 如果您只执行子查询,那么您会看到每个供应商和年份的销售列表 - 并且是连接的所需年份 (-1)。但是带有月份的条件必须在子查询中,所以 WHERE MONTH(b.yearDate)
  • SUM(sales) as 'sales' 现在看起来像这样 sum(case when YEAR(month) = YEAR(DATE_SUB(CURDATE(), INTERVAL 1 YEAR)) AND Month(month)
猜你喜欢
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多