我的动态数据透视表mysql的计算

问题描述 投票:0回答:1

请考虑以下示例数据集...

CREATE TABLE `acc_2020`(  
  `InvDate` DATE,
  `fulldate` VARCHAR(250),
  `AccountID` VARCHAR(250),
  `InvTotExclDEx` FLOAT,
  `mainNAME` VARCHAR(250),
  `Name` VARCHAR(250)
);

INSERT INTO `acc_2020` VALUES  
("2017-07-18 00:00:00","2017-07","550","5254.00","SHOPRITE N/CAPE F/STATE","SHOPRITE MMABATHO"),
("2017-10-06 00:00:00","2017-10","550","2328.00","SHOPRITE N/CAPE F/STATE","SHOPRITE MMABATHO"),
("2017-11-27 00:00:00","2017-11","550","5688.00","SHOPRITE N/CAPE F/STATE","SHOPRITE MMABATHO"),
("2018-06-11 00:00:00","2018-06","550","2250.00","SHOPRITE N/CAPE F/STATE","SHOPRITE MMABATHO"),
("2018-08-13 00:00:00","2018-08","550","5512.00","SHOPRITE N/CAPE F/STATE","SHOPRITE MMABATHO"),
("2018-12-13 00:00:00","2018-12","550","11888.00","SHOPRITE N/CAPE F/STATE","SHOPRITE MMABATHO"),
("2019-04-04 00:00:00","2019-04","550","-10622.00","SHOPRITE N/CAPE F/STATE","SHOPRITE MMABATHO"),
("2019-05-29 00:00:00","2019-05","550","3125.00","SHOPRITE N/CAPE F/STATE","SHOPRITE MMABATHO"),
("2019-06-14 00:00:00","2019-06","550","1185.00","SHOPRITE N/CAPE F/STATE","SHOPRITE MMABATHO") ;

我的代码以正确的格式等带回了数据,因此在这方面一切都很好。我唯一的问题是,它不能将所有金额相加。

    DELIMITER $$

USE `pastel`$$

DROP PROCEDURE IF EXISTS `fin_year_accmt_z1`$$

CREATE DEFINER=`qadmin`@`%` PROCEDURE `fin_year_accmt_z1`(IN InvDate1 VARCHAR(255))
BEGIN
SET @InvDate1 = InvDate1;
SET @InvDate21 = CONCAT(LEFT(@InvDate1,7),'-01');
SET @InvDate22 = LAST_DAY(DATE_ADD(CONCAT(LEFT(@InvDate1,7),'-01'),INTERVAL 11 MONTH));
SET @InvDate23 = LAST_DAY(DATE_SUB(CURDATE(),INTERVAL 1 YEAR));
SET @InvDate31 = DATE_ADD(CONCAT(LEFT(@InvDate1,7),'-01') ,INTERVAL 1 YEAR);
SET @InvDate32 = LAST_DAY(DATE_ADD(CONCAT(LEFT(@InvDate1,7),'-01'),INTERVAL 23 MONTH));

SET @@group_concat_max_len = 32000;
SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(fulldate = ''',fulldate,''', InvTotExclDEx, 0)) AS ', '`',fulldate,'`') 
ORDER BY
    CASE
        WHEN
            MONTH(InvDate) < MONTH(@InvDate21)
 THEN 100 + MONTH(InvDate)
        ELSE MONTH(InvDate)
    END,
    YEAR(InvDate)
) 
AS output
FROM acc_2020 
WHERE 
(
acc_2020.`InvDate` >= @InvDate21 
AND 
CASE
WHEN DATEDIFF(CURDATE(),(@InvDate1)) >= 1300
 THEN acc_2020.`InvDate` <= (@InvDate22)
 ELSE acc_2020.`InvDate` <= (@InvDate23) END)

OR 
(acc_2020.`InvDate` >= @InvDate31 
AND acc_2020.`InvDate` <= @InvDate32)
-- redirect output to a variable
INTO @sql_1;
SET @sql = @sql_1;
-- end redirection
SET @sql = CONCAT('
    SELECT mainNAME
                    , Name,',@sql,' 
                   FROM acc_2020
                   WHERE 
                   ((
                   `InvDate`>= (''',@InvDate21,''')
           AND(
           CASE 
    WHEN DATEDIFF(CURDATE(),(''',@InvDate1,''')) >= 1300
 THEN  `InvDate`<=(''',@InvDate22,''')
 ELSE InvDate <= (''',@InvDate23,''') END))
 OR
            (`InvDate`>= (''',@InvDate31,''')
            AND 
            `InvDate` <= (''',@InvDate32,''')
            )
                   )


                    GROUP BY mainNAME,Name
                    ORDER BY MONTH(InvDate),YEAR(InvDate) ASC,mainNAME 
                    ')
;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
    END$$

DELIMITER ;

当我添加fulldate时,它带回了所有内容,但现在不再排成一排,击败了数据透视表。当我取出完整的日期进行分组时,它将所有内容都放在一行中,但不会返回所有数据,所以我想我知道问题出在哪里,只是不确定如何解决。

[当我运行> = 2019的报告时,会显示正确的金额,但是当我运行> = 2018的报告时,它不会返回数据,因为没有输入2018年4月的数据,只有2019年4月。

请帮助。我做错了什么

GROUP BY mainNAME,名称,完整日期

以便澄清。当我运行

CALL `fin_year_accmt_z1`('2019-01-07')

2019-04是-1280。但是当我运行CALL fin_year_accmt_z1('2018-01-07')

2019-04为0。

https://dbfiddle.uk/?rdbms=mysql_5.5&fiddle=44cc2b9690d6df3c66ea96cc69c8ecdb

mysql stored-procedures pivot
1个回答
0
投票

通过一些调整将其修复。现在可以100%工作。

还是草莓谢谢。

DELIMITER $$

USE `pastel`$$

DROP PROCEDURE IF EXISTS `fin_year_accmt_z1`$$

CREATE DEFINER=`qadmin`@`%` PROCEDURE `fin_year_accmt_z1`(IN InvDate1 VARCHAR(255))
BEGIN
SET @InvDate1 = InvDate1;
SET @sql = NULL;

SET @InvDate21 = CONCAT(LEFT(@InvDate1,7),'-01');
SET @InvDate22 = LAST_DAY(DATE_ADD(CONCAT(LEFT(@InvDate1,7),'-01'),INTERVAL 11 MONTH));
SET @InvDate23 = LAST_DAY(DATE_SUB(CURDATE(),INTERVAL 1 YEAR));
SET @InvDate31 = DATE_ADD(CONCAT(LEFT(@InvDate1,7),'-01') ,INTERVAL 1 YEAR);
SET @InvDate32 = LAST_DAY(DATE_ADD(CONCAT(LEFT(@InvDate1,7),'-01'),INTERVAL 23 MONTH));
SET @@group_concat_max_len = 32000;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(if(t.fulldate = ''',
      fulldate,
      ''', t.InvTotExclDEx, 0)) AS `',
      fulldate ,'`'
    )
    ORDER BY
    CASE
        WHEN
            MONTH(InvDate) < MONTH(@InvDate21)
 THEN 100 + MONTH(InvDate)
        ELSE MONTH(InvDate)
    END,
    YEAR(InvDate)

  ) INTO @sql
FROM `acc_2020`

 WHERE 
(
`InvDate` >= @InvDate21 
AND 
CASE
WHEN DATEDIFF(CURDATE(),(@InvDate1)) >= 1300
 THEN `InvDate` <= (@InvDate22)
 ELSE `InvDate` <= (@InvDate23) END)

OR 
(`InvDate` >= @InvDate31 
AND `InvDate` <= @InvDate32)
 ;


SET @sql = CONCAT('SELECT t.mainNAME,t.name, ', @sql, ' FROM acc_2020 t

 WHERE 
                   ((
                   `t`.`InvDate`>= (''',@InvDate21,''')
           AND(
           CASE 
    WHEN DATEDIFF(CURDATE(),(''',@InvDate1,''')) >= 1300
 THEN  `t`.`InvDate`<=(''',@InvDate22,''')
 ELSE t.InvDate <= (''',@InvDate23,''') END))
 OR
            (`t`.`InvDate`>= (''',@InvDate31,''')
            AND 
            `t`.`InvDate` <= (''',@InvDate32,''')
            )
                   )




group by t.mainNAME,t.Name
order by MONTH(t.InvDate),YEAR(t.InvDate),t.mainNAME,t.Name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
    END$$

DELIMITER ;
© www.soinside.com 2019 - 2024. All rights reserved.