Рассмотрим следующий пример набора данных ...
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") ;
Мой код возвращает данные в правильном формате et c. так что все хорошо на этом фронте. Единственная проблема, которую я имею, состоит в том, что она не суммирует все суммы.
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 года, только 2019 апреля.
Пожалуйста, помогите. что я делаю не так
GROUP BY mainNAME, Name, fulldate
, чтобы уточнить. когда я запускаю
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