请考虑以下示例数据集...
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
通过一些调整将其修复。现在可以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 ;