【问题标题】:MySQL Pivot data into Year MonthsMySQL将数据透视到年月
【发布时间】:2018-07-27 09:46:45
【问题描述】:

我有两张表学生和班级费用,我想获得报告以查看学生是否支付了费用。

我尝试了这个 mysql 查询,这正是我想要的,但是月份和年份存在问题,我也得到了空列。

这是我尝试过的查询

选择 学生.stu_name, SUM(IF(MONTH(fees.date) = 1, fee.amt, 0)) AS Jan, SUM(IF(MONTH(fees.date) = 2, fee.amt, 0)) AS 2 月, SUM(IF(MONTH(fees.date) = 3, fee.amt, 0)) AS Mar, SUM(IF(MONTH(fees.date) = 4, fee.amt, 0)) AS Apr, SUM(IF(MONTH(fees.date) = 5, fee.amt, 0)) AS 5 月, SUM(IF(MONTH(fees.date) = 6, fee.amt, 0)) AS Jun, SUM(IF(MONTH(fees.date) = 7, fee.amt, 0)) 如七月, SUM(IF(MONTH(fees.date) = 8, fee.amt, 0)) 八月, SUM(IF(MONTH(fees.date) = 9, fee.amt, 0)) AS 9 月, SUM(IF(MONTH(fees.date) = 10, fee.amt, 0)) AS Oct, SUM(IF(MONTH(fees.date) = 11, fee.amt, 0)) AS 11 月, SUM(IF(MONTH(fees.date) = 12, fee.amt, 0)) AS Dece, SUM(fees.amt) 总计, (28000-(SUM(fees.amt))) 作为余额 从 `费用` INNER JOIN student ON fee.stu_id = student.id 按学生.stu_id 分组

This is the result i'm getting

如果我在两年内添加数据会有问题。

I want to get table like this (orders by month years)

我已经为此工作了数周,但我找不到任何解决方案。如果您能为此提供帮助,我将不胜感激。

【问题讨论】:

  • 我只是不明白为什么当你有 php 可用时你会这样做。
  • 我不明白如何使用 php 执行此操作。但我发现教程link 我无法转换为 php。你能帮我吗?我被困在这里。如果这并不像我想的那么难,我很抱歉,因为我自学了所有来自互联网的东西。
  • 这两个结果似乎没有任何关系。这使得进一步提供帮助变得困难。见:Why should I provide an MCVE for what seems to me to be a very simple SQL query?

标签: php mysql pivot


【解决方案1】:

这个答案可能为时已晚,但我建议使用第三个表 feedsTotals 来设置每年的提要总数。像这样:

create table feesTotals (
  id INT NOT NULL AUTO_INCREMENT,
  year INT,
  total DECIMAL(13,2),
  PRIMARY KEY (id)
);

INSERT INTO feesTotals(year,total) 
VALUES (2018, 28000.00) , (2019, 29000.00);

你可以像这样做你想要的查询:

SELECT
        student.stu_name,
        feesTotals.year,
        SUM(IF(MONTH(fees.date) = 1, fees.amt, 0)) AS Jan,
        SUM(IF(MONTH(fees.date) = 2, fees.amt, 0)) AS Feb,
        SUM(IF(MONTH(fees.date) = 3, fees.amt, 0)) AS Mar,
        SUM(IF(MONTH(fees.date) = 4, fees.amt, 0)) AS Apr,
        SUM(IF(MONTH(fees.date) = 5, fees.amt, 0)) AS May,
        SUM(IF(MONTH(fees.date) = 6, fees.amt, 0)) AS Jun,
        SUM(IF(MONTH(fees.date) = 7, fees.amt, 0)) AS Jul,
        SUM(IF(MONTH(fees.date) = 8, fees.amt, 0)) AS Aug,
        SUM(IF(MONTH(fees.date) = 9, fees.amt, 0)) AS Sep,
        SUM(IF(MONTH(fees.date) = 10, fees.amt, 0)) AS Oct,
        SUM(IF(MONTH(fees.date) = 11, fees.amt, 0)) AS Nov,
        SUM(IF(MONTH(fees.date) = 12, fees.amt, 0)) AS Dece,
        feesTotals.total AS Total,
        (feesTotals.total-(SUM(IFNULL(fees.amt,0)))) AS Balance
FROM student CROSS JOIN feesTotals 
LEFT JOIN fees ON fees.stu_id = student.id AND YEAR(fees.date) = feesTotals.year
GROUP BY student.stu_name, feesTotals.year, feesTotals.total

查看 DB Fiddle 上的示例here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多