Расчет моей динамики c сводная таблица mysql - PullRequest
0 голосов
/ 29 апреля 2020

Рассмотрим следующий пример набора данных ...

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

1 Ответ

0 голосов
/ 29 апреля 2020

исправлено с небольшим изменением. теперь работает на 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 ;
...