【问题标题】:Custom output from a mysql query来自 mysql 查询的自定义输出
【发布时间】:2021-04-18 06:02:48
【问题描述】:

考虑以下架构:

    CREATE TABLE `Result` (
  `startDate` date NOT NULL,
  `description` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `value` decimal(15,4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `Result`
(`startDate`,
`description`,
`value`)
VALUES
('2020-09-01' ,'Allowance' ,4000),
('2020-09-01' ,'Salary' ,1500),
('2020-10-01' ,'Allowance' ,2000),
('2020-10-01' ,'Salary' ,3000),
('2020-10-01' ,'Deduction' ,-200);

给定一个日期,结果应显示为描述和开始日期的总和以及所选日期与上一个日期(月份)之间的差异。因此,如果选择 10 月,则查询结果应显示为,

description SeptemberTotal OctoberTotal Variance
Allowance       4000         2000        -2000
Salary          1500         3000         1500 
Deduction       0            -200         -200

我尝试使用联合和枢轴,

SELECT @selectDate:='2020-10-01'; -- set desired date

SELECT 
    t.month,  
    t.description,
     Gross,
from (
    SELECT 
        DATE_FORMAT(pi.startDate, '%b/%y') AS 'Month',
        SUM(pi.value) AS gross,
        description
    FROM
        Result pi
    WHERE
        pi.startDate = DATE_SUB(@selectDate, INTERVAL 1 MONTH) -- select previous month
    GROUP BY description 
    UNION SELECT 
        DATE_FORMAT(pi.startDate, '%b/%y') AS 'Month',
        SUM(pi.value) AS gross,
        description
    FROM
        Result pi
    WHERE
        pi.startDate = @selectDate
    GROUP BY description) t
GROUP BY t.Month,t.description
;

结果为,

Month   description   Gross
Sep/20  Allowance     4000
Sep/20  Salary        1500
Oct/20  Allowance     2000
Oct/20  Salary        3000
Oct/20  Deduction    -200

这并不完全符合要求。我也尝试过数据透视查询,但也没有按要求显示输出。

db-fiddle

【问题讨论】:

  • 添加 MonthYear 检索子查询作为基础(或在 CTE 中生成),LEFT JOIN 另一个 src 表副本。使用客户的报告子系统进行透视。
  • @Strawberry 在这种情况下将是 10 月总计 - 9 月总计,我已经编辑了所需的输出

标签: mysql mysql-8.0


【解决方案1】:
SET @m1 := '2020-09-01';
SET @m2 := '2020-10-01';

SELECT Result.Description, 
       COALESCE(SUM(CASE WHEN Result.startDate = @m1 THEN value END), 0) Total1,
       COALESCE(SUM(CASE WHEN Result.startDate = @m2 THEN value END), 0) Total2,
       COALESCE(SUM(CASE WHEN Result.startDate = @m2 THEN value END), 0) -
       COALESCE(SUM(CASE WHEN Result.startDate = @m1 THEN value END), 0) Variance
FROM ( SELECT @m1 startDate UNION ALL SELECT @m2 ) baseDates
LEFT JOIN Result USING (startDate)
GROUP BY Result.Description

fiddle

【讨论】:

    【解决方案2】:

    选择 说明,

    sum(if(startDate between '2020-11-01 00:00:00' 和 '2020-11-31 23:59:59' ,value,0)) 1st,

    sum(if(startDate between '2020-12-01 00:00:00' and '2020-12-31 23:59:59',value,0)) 2nd,

    sum(if('2020-11-01 00:00:00' 和 '2020-11-31 23:59:59' 之间的 startDate ,value,0))-sum(if(created_at '2020- 12-01 00:00:00' 和 '2020-12-31 23:59:59',value,0)) 方差

    来自 结果 其中 startDate 在 '2020-11-01 00:00:00' 和 '2020-12-31 23:59:59' 之间按描述分组

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      相关资源
      最近更新 更多