Eftersom ingen annan har svarat. Jag ger dig min idé. Grunden för alla är
CREATE TABLE tank
(`Tank_ID` int, `Tank` varchar(6))
;
INSERT INTO tank
(`Tank_ID`, `Tank`)
VALUES
(1, 'Tank 1'),
(2, 'Tank 2'),
(3, 'Tank 3'),
(4, 'Tank 4'),
(5, 'Tank 5');
CREATE TABLE tank_detail
(`Tank_ID` int, `Receipt` int, `Date` date);
INSERT INTO tank_detail
(`Tank_ID`, `Receipt`, `Date`)
VALUES
(1, 1000, '2019-07-10'),
(2, 2000, '2019-07-10'),
(3, 3000, '2019-07-10'),
(1, 0, '2019-07-10'),
(1, 0, '2019-07-15'),
(3, 0, '2019-07-15'),
(2, 0, '2019-07-15'),
(3, 0, '2019-07-15'),
(1, 250, '2019-07-15'),
(2, 200, '2019-07-15'),
(3, 800, '2019-07-15'),
(1, 250, '2019-07-15'),
(4, 350, '2019-07-15'),
(1, 0, '2019-07-20'),
(2, 0, '2019-07-20'),
(3, 0, '2019-07-20'),
(4, 0, '2019-07-20'),
(1, 300, '2019-07-20'),
(2, 1200, '2019-07-20'),
(3, 1400, '2019-07-20'),
(4, 900, '2019-07-20'),
(5, 20, '2019-07-20'),
(1, 500, '2019-07-20');
Från det bygger jag först en statisk SQL-sats
Select Date,Sum(recsum) as Receipt
, Sum(a1) as 'Tanl 1'
, Sum(a2) as 'Tanl 2'
, Sum(a3) as 'Tank 3'
, Sum(a4) as 'Tanl 4'
, Sum(a5) as 'Tanl 5'
From
(Select tank_detail.Tank_ID tankid,Date,Sum(Receipt) recsum
, if (tank_detail.Tank_ID = 1, Sum(Receipt),0) as a1
, if (tank_detail.Tank_ID = 2, Sum(Receipt),0) as a2
, if (tank_detail.Tank_ID = 3, Sum(Receipt),0) as a3
, if (tank_detail.Tank_ID = 4, Sum(Receipt),0) as a4
, if (tank_detail.Tank_ID = 5, Sum(Receipt),0) as a5
From tank_detail
Group by tank_detail.Tank_ID,Date) td1
Group by Date ;
Och utifrån det bygger jag en lagrad procedur med en loop
CREATE DEFINER=`root`@`localhost` PROCEDURE `procedure_Receipt_Tank`()
BEGIN
DECLARE bDone int DEFAULT 0;
DECLARE tanknumber int DEFAULT 0;
DECLARE tabkname VARCHAR(10);
DECLARE Tempvar LONGTEXT DeFAULT '';
DECLARE Tempvar2 LONGTEXT DeFAULT '';
DECLARE curs1 CURSOR FOR SELECT Tank_ID,Tank From tank;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET bDone = 1;
OPEN curs1;
SET Tempvar = CONCAT(Tempvar , 'Select Date,Sum(recsum) as Receipt ');
SET Tempvar2 = CONCAT(Tempvar2 , ' From ');
SET Tempvar2 = CONCAT(Tempvar2 , '(Select tank_detail.Tank_ID
tankid,Date,Sum(Receipt) recsum ');
read_loop: LOOP
FETCH curs1 INTO tanknumber,tabkname;
IF bDone = 1 THEN
LEAVE read_loop;
END IF;
SET Tempvar = CONCAT(Tempvar , ' , Sum(a',tanknumber,') as "',tabkname,'"');
SET Tempvar2 = CONCAT(Tempvar2 , ', if (tank_detail.Tank_ID = ',tanknumber,',
Sum(Receipt),0) as a',tanknumber,' ');
END LOOP read_loop;
CLOSE curs1;
SET Tempvar = CONCAT(Tempvar ,Tempvar2,' From tank_detail ');
SET Tempvar = CONCAT(Tempvar ,' Group by tank_detail.Tank_ID,Date) td1');
SET Tempvar = CONCAT(Tempvar ,' Group by Date;');
SET @v_Query = '';
SET @v_Query = CONCAT(@v_Query , Tempvar);
PREPARE stmt FROM @v_Query;
execute stmt;
#Select Tempvar;
END
Du kan anropa det genom att använda call procedure_Receipt_Tank(); Jag skulle personligen lägga till en tidsram där du vill ha data. För detta lägger du till den lagrade proceduren från datum och du måste också lägga till ett datum i samtalsproceduren. Det största problemet är att denna lagrade procedur bygger en Select-sats, som den exekverar i slutet. tempvar är långtext och kan vara upp till 4 gb