come sommare dei record raggruppandoli per anno

clodiny

Nuovo Utente
4 Nov 2015
27
0
0
salve a tutti...

sono un neofita, per cui vi chiedo scusa in anticipo per le "bestialità che scriverò.

cercando di essere il più chiaro possibile, il problema che ho è il seguente:

su DB MySql da una tabella tipo questa: ID, data, gruppo, voce, importo,

vorrei ricavare una tabella che mi sommi gli importi per "gruppo" raggruppandoli per anno solare,

come ad esempio:

gruppo201020112012...
gruppo 11000.00235.00700.00560.00
gruppo 2670.001200.00125.00470.00
gruppo 348.00230.00170.0012.00
gruppo n320.00160.00630.0058.00




grazie di tutto
 

clodiny

Nuovo Utente
4 Nov 2015
27
0
0
se può essere utile inserisco la tabella dei dati (generata con phpmyadmin):

PHP:
--
-- Struttura della tabella `tabella`
--

CREATE TABLE IF NOT EXISTS `tabella` (
  `ID` int(20) NOT NULL,
  `data` date NOT NULL ,
  `gruppo` int(20) NOT NULL ,
  `voce` int(20) NOT NULL ,
  `importo` decimal(10,2) DEFAULT '0.00'
) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8;

--
-- Dump dei dati per la tabella `tabella`
--
INSERT INTO `tabella` (`ID`, `data`, `gruppo`, `voce`, `importo`) VALUES
( 1, '2010-07-27',  7,  2, ' 9.44'),
( 2, '2011-08-01',  7,  2, ' 4.95'),
( 3, '2012-07-04',  7,  2, '37.00'),
( 4, '2010-08-02', 13, 51, ' 1.00'),
( 5, '2011-07-27',  7,  2, '14.00'),
( 6, '2012-07-27',  7,  8, ' 6.44'),
( 7, '2010-08-01', 13, 51, ' 2.30'),
( 9, '2011-06-26',  7,  2, '17.39'),
(10, '2012-06-26', 13, 51, ' 4.40'),
(11, '2010-06-30',  7,  2, '27.58'),
(12, '2011-07-16', 13, 51, ' 5.00'),
(13, '2012-07-02', 11, 42, '50.00'),
(14, '2010-07-02',  7,  2, '24.35'),
(15, '2011-07-02',  7,  2, ' 2.00'),
(16, '2012-08-02',  7,  2, '13.65'),
(17, '2010-07-15',  7,  2, '21.00'),
(18, '2011-07-15',  7,  2, ' 2.13'),
(19, '2012-07-03',  7,  2, '92.00'),
(20, '2010-06-26',  7, 10, '12.00'),
(21, '2011-07-11', 13, 51, '10.00'),
(22, '2012-07-30', 11, 40, '33.00'),
(23, '2010-07-30', 11, 41, ' 7.00'),
(24, '2011-07-10', 11, 38, '69.00'),
(25, '2012-07-21', 11, 42, '50.00'),
(26, '2010-06-27', 13, 59, '18.00'),
(28, '2011-07-24',  7,  2, '13.38'),
(29, '2012-08-03',  7,  2, '20.04'),
(30, '2010-08-04',  9, 30, ' 0.50'),
(31, '2011-07-29',  7,  2, '12.79'),
(32, '2012-07-23',  7,  2, '11.47'),
(33, '2010-07-19', 13, 59, ' 4.50'),
(35, '2011-07-19',  7,  2, '35.00'),
(36, '2012-07-19',  7,  2, ' 9.57'),
(37, '2010-07-16', 11, 38, '12.50'),
(38, '2011-07-11',  9, 31, '11.05'),
(39, '2012-04-24', 11, 45, '35.50'),
(41, '2010-07-04',  9, 31, '11.29'),
(42, '2011-07-03',  7,  2, '29.61'),
(43, '2012-07-01',  9, 31, '11.36'),
(44, '2010-06-22',  9, 31, '10.98'),
(45, '2011-07-04',  7,  2, '27.00'),
(46, '2012-06-03', 13, 58, '33.00'),
(47, '2010-06-10', 13, 51, ' 5.00'),
(48, '2011-07-04', 13, 51, ' 5.00'),
(49, '2012-04-24',  9, 30, ' 0.60'),
(50, '2010-04-21',  7,  2, '11.19')
quello che mi servirebbe è una query che generasse una tabella come nella nota precedente.

i dati vengono visualizzati in una pagine html in una <table></table>.

grazie
 
Ultima modifica:

clodiny

Nuovo Utente
4 Nov 2015
27
0
0
si, il codice che ho imbastito è tipo questo:

HTML:
<table id="tabellaSommaGruppi" class="table  table-bordered">
      <?php  echo _generaReport(); ?>
</table>
PHP:
function _generaReport(){

  //connessione al DB...
  $dblink = new DB(HOST, USER, PASSWORD, DBNAME, TYPEDB);
  if ( !$dblink->connect()){
    echo 'La connessione al databare ($DBNAME) non è riuscita';
  }

  //query
  $tabellaSommaGruppo = Table::Select("SELECT gruppo, SUM(importo) as somma_importo_gruppo FROM tabella GROUP BY gruppo");

  $rowGenerate  = "<thead>".chr(10);
  $rowGenerate .= "  <tr role=\"row\">".chr(10);
  $rowGenerate .= "    <th class=\"colonna1\" >Gruppo</th>".chr(10);
  $rowGenerate .= "    <th class=\"colonna2\" >Voce</th>".chr(10);
  $rowGenerate .= "    <th class=\"colonna3 center\" >Importo</th>".chr(10);
  $rowGenerate .= "  </tr>".chr(10);
  $rowGenerate .= "</thead>".chr(10);
  $rowGenerate .= "<tbody>".chr(10);


  foreach ($tabellaSommaGruppo as $rigaSommaGruppo){
    //visualizzo solo i gruppi con importo non nullo
    if($rigaSommaGruppo->somma_importo_gruppo == NULL)
      continue;

    // ricavo il nome del gruppo dalla relativa tabella
    $data = Table::FetchById('_gruppi', $rigaSommaGruppo->gruppo);
    $nome_gruppo = $data->nome;


    $idRow = "gruppo_".$rigaSommaGruppo->gruppo;

    $rowGenerate .= "  <tr id=\"$idRow\" class=\"gruppo\">".chr(10);
    $rowGenerate .= "    <td class=\"\" >$nome_gruppo</td>".chr(10);
    $rowGenerate .= "    <td></td><td class=\"center\" >$rigaSommaGruppo->somma_importo_gruppo</td>".chr(10);
    $rowGenerate .= "  </tr>".chr(10);
  }

  $rowGenerate .= "</tbody>".chr(10);

  return $rowGenerate;
}

ma questo codice fa solo la somma totale per ogni gruppo....
io vorrei fare un raggruppamento per anni...
 
Ultima modifica:

clodiny

Nuovo Utente
4 Nov 2015
27
0
0
ho provato anche con una query tipo questa:

PHP:
  SELECT gruppo as Gruppo,
    SUM(importo) AS '2010' FROM `tabella` WHERE data BETWEEN "2010-01-01" AND "2010-12-31"
  GROUP BY gruppo
ma non so come fare per generare la colonna per il 2011, 2012 ...

pensavo ad una query tipo questa per dare l'idea anche se non corretta:

PHP:
  SELECT gruppo as Gruppo,
    SUM(importo) AS '2010' FROM `tabella` WHERE data BETWEEN "2010-01-01" AND "2010-12-31"
    SUM(importo) AS '2011' FROM `tabella` WHERE data BETWEEN "2011-01-01" AND "2011-12-31"
    SUM(importo) AS '2012' FROM `tabella` WHERE data BETWEEN "2012-01-01" AND "2012-12-31"
       .
       .
       .
  GROUP BY gruppo
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
2.708
140
63
Lombardia
prova così,
PHP:
SELECT 
 distinct gruppo
,(select sum(importo) from tabpivot where gruppo=t.gruppo and data BETWEEN '2010-01-01' AND '2010-12-31') i2010
,(select sum(importo) from tabpivot where gruppo=t.gruppo and data BETWEEN '2011-01-01' AND '2011-12-31') i2011
from tabpivot t
// order by gruppo desc
questo è il risultatoCattura.PNG

(attento alla t finale, non scordarla)
ciao
Marino
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
2.708
140
63
Lombardia
ps, nel caso di quantità elevate di record, se gruppo fosse indicizzato, la query sarebbe veloce, altrimenti scorrerebbe serialmente la tabella molte volte con degrado del tempo di risposta
 

clodiny

Nuovo Utente
4 Nov 2015
27
0
0
la query funzione, ora mi occorre capire come tirare fuori l'anno dalla data per creare uno script PHP che inserisca una rigra:
PHP:
...
" ,(select sum(importo) from tabpivot where gruppo=t.gruppo and data BETWEEN ' ".$anno."-01-01' AND ' ".$anno."-12-31')".$anno
...


ps, nel caso di quantità elevate di record, se gruppo fosse indicizzato, la query sarebbe veloce, altrimenti scorrerebbe serialmente la tabella molte volte con degrado del tempo di risposta
la tabella dei gruppi è : id , nome gruppo, note
con id come chiave: primaria, unica, auto incrementale

7, 9,11,13 sono gli ID della tabella dei gruppi
 

clodiny

Nuovo Utente
4 Nov 2015
27
0
0
ps, nel caso di quantità elevate di record, se gruppo fosse indicizzato, la query sarebbe veloce, altrimenti scorrerebbe serialmente la tabella molte volte con degrado del tempo di risposta
forse parliamo di due tabelle diverse visto che nella tua lista manca l'importo

forse non ho capito cosa intendi con
se gruppo fosse indicizzato....
con riferimento al secondo post
PHP:
INSERT INTO `tabella` (`ID`, `data`, `gruppo`, `voce`, `importo`) VALUES
( 1, '2010-07-27',  7,  2, ' 9.44'),
( 2, '2011-08-01',  7,  2, ' 4.95'),
( 3, '2012-07-04',  7,  2, '37.00'),
da phpmyadmin, ID di 'tabella' è una chiave auto Incrementale:
[table="width: 500, class: grid]
[tr]
[td]Chiave[/td]
[td]Tipo[/td]
[td]Unica[/td]
[td]Compresso[/td]
[td]Colonna[/td]
[td]Cardinalità[/td]
[td]Codifica caratteri[/td]
[td]Null[/td]
[/tr]
[tr]
[td]PRIMARY[/td]
[td]BTREE[/td]
[td]Sì[/td]
[td]No[/td]
[td]ID[/td]
[td]51[/td]
[td]A[/td]
[td]No[/td]
[/tr]
[/table]
 

marino51

Utente Attivo
28 Feb 2013
2.708
140
63
Lombardia
le select lavorano con le clausole where su gruppo e data, id non viene utilizzato,
se la tabella con gli importi, conterrà decine di migliaia di record, andrebbe indicizzata anche su gruppo e data
altrimenti le selezioni avverranno leggendo sempre l'intera tabella con un degrado dei tempi di risposta
 

clodiny

Nuovo Utente
4 Nov 2015
27
0
0
le select lavorano con le clausole where su gruppo e data, id non viene utilizzato,
se la tabella con gli importi, conterrà decine di migliaia di record, andrebbe indicizzata anche su gruppo e data
altrimenti le selezioni avverranno leggendo sempre l'intera tabella con un degrado dei tempi di risposta

quindi devrei impostare su phpmyadmin "gruppo" e "data" come indice

ChiaveTipoUnicaCompressoColonnaCardinalitàCodifica caratteriNull
PRIMARYBTREENoID1198ANo
gruppoBTREENoNogruppo22ANo
dataBTREENoNodata1198ANo

in questo modo???
 

clodiny

Nuovo Utente
4 Nov 2015
27
0
0
sto provando a generare la tavella con php.

PHP:
function _generaReport(){
  //ricavo gli anni, che mi servono per generare le colonne della tabella Confronto.
  $anni_confronto = Table::Select("SELECT distinct YEAR(data) as anni FROM tabpivot GROUP BY anni DESC");  

  //genero la query
  $query = "SELECT distinct  gruppo, (SELECT SUM(importo) FROM tabpivot WHERE gruppo=t.gruppo) iTot";
  foreach ($anni_confronto as $riga){
      $query .= ",(SELECT SUM(importo) FROM tabpivot WHERE gruppo=t.gruppo AND YEAR(data)= $riga->anni) \"i".$riga->anni."\" ";
  }
  $query .= " FROM tabpivot t   ORDER BY t.gruppo ASC";

  $tabellaConfronto = Table::Select($query);

  //intestazione tabella di confronto
  $html = "<thead>"
        . "  <tr>"
        . "    <th>Gruppo</th>"
        . "    <th>TOTALE</th>";
  foreach ($anni_confronto as $riga){
    $html .= " <th>$riga->anni</th>";
  }
  $html .= "  </tr>"
         . "</thead>"
         . "<tbody>";

  //righe della tabella di confronto
  foreach ($tabellaConfronto as $rigaSommaGruppo){
    $html .= "  <tr>"
           . "    <td>$nome_gruppo</td>"
           . "    <td>$rigaSommaGruppo->iTot</td>";

    foreach ($anni_confronto as $riga){
      $v = "$rigaSommaGruppo->i".$riga->anni;
      $html .= "    <td>".$v."</td>";
    }

    $html .= "  </tr>";
  }

  $html .= "</tbody>";


  return $html;
}
ma questo script mi genera un errore sulle colonne degli anni:
GruppoTOTALEi2012i2011i2010
7453.98I not exists in table 2012I not exists in table 2011I not exists in table 2010
945.78I not exists in table 2012I not exists in table 2011I not exists in table 2010
11257.00I not exists in table 2012I not exists in table 2011I not exists in table 2010
1388.20I not exists in table 2012I not exists in table 2011I not exists in table 2010

e non riesco veramente a capire dov'è il problema....

HELP
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
2.708
140
63
Lombardia
ma se la query fosse così,
PHP:
select * from (
SELECT distinct gruppo, 9999 as anno
,(select sum(importo) from tabpivot where gruppo=t.gruppo) importo
from tabpivot t
union
SELECT distinct gruppo, year(data) as anno
,(select sum(importo) from tabpivot where gruppo=t.gruppo and year(data)=year(t.data)) importo
from tabpivot t
) x  order by x.gruppo, x.anno desc
magari lo script php è meno impegnativo, sbaglio ?
 

marino51

Utente Attivo
28 Feb 2013
2.708
140
63
Lombardia
se ti piace ....
PHP:
<?php

require_once 'Config_DB.php';

$sql="
select * from (
SELECT gruppo, 9999 as anno, sum(importo) as importo from tabpivot group by gruppo
union
SELECT distinct 
 gruppo
,year(data) as anno
,(select sum(importo) from tabpivot where gruppo=t.gruppo and year(data)=year(t.data)) importo
from tabpivot t
) x  order by x.gruppo, x.anno desc
";

$nrighe = 0;
$tabella = "";
$titolo = "<tr><td>GRUPPO</td><td>TOTALE</td>";

$sth = $db->query($sql); 
$sth->setFetchMode( PDO::FETCH_ASSOC ); 
while( $row = $sth->fetch() )
{
	if ( $row['anno'] == 9999 )
	{
		$nrighe  += 1;

		if ( $nrighe > 1 ) 
		{
			$tabella .= "</tr>";
			$tr = false;
		}


		$tabella .= "<tr><td>".$row['gruppo']."</td>";
		$tr = true;
	}
	else
	{
		if ( $nrighe == 1 ) $titolo .= "<td>".$row['anno']."</td>";
	}
	$importo  = number_format($row['importo'], 2, ",", ".");
	$tabella .= "<td>".$importo."</td>";
}
$titolo .= "</tr>";
if ( $tr === true ) $tabella .= "</tr>";

echo "<table>".$titolo.$tabella."</table>"."<br />";
?>
Cattura.PNG
 
Ultima modifica:

clodiny

Nuovo Utente
4 Nov 2015
27
0
0
ciao Marino

se ti piace ....
PHP:
<?php

require_once 'Config_DB.php';

$sql="
select * from (
SELECT gruppo, 9999 as anno, sum(importo) as importo from tabpivot group by gruppo
union
SELECT distinct 
 gruppo
,year(data) as anno
,(select sum(importo) from tabpivot where gruppo=t.gruppo and year(data)=year(t.data)) importo
from tabpivot t
) x  order by x.gruppo, x.anno desc
";

$nrighe = 0;
$tabella = "";
$titolo = "<tr><td>GRUPPO</td><td>TOTALE</td>";

$sth = $db->query($sql); 
$sth->setFetchMode( PDO::FETCH_ASSOC ); 
while( $row = $sth->fetch() )
{
	if ( $row['anno'] == 9999 )
	{
		$nrighe  += 1;

		if ( $nrighe > 1 ) 
		{
			$tabella .= "</tr>";
			$tr = false;
		}


		$tabella .= "<tr><td>".$row['gruppo']."</td>";
		$tr = true;
	}
	else
	{
		if ( $nrighe == 1 ) $titolo .= "<td>".$row['anno']."</td>";
	}
	$importo  = number_format($row['importo'], 2, ",", ".");
	$tabella .= "<td>".$importo."</td>";
}
$titolo .= "</tr>";
if ( $tr === true ) $tabella .= "</tr>";

echo "<table>".$titolo.$tabella."</table>"."<br />";
?>
Vedi l'allegato 2779

grazie per la grandissima dritta.

facendo dei test con li codice che mi hai postato, mi sono accorto che nel caso in cui un gruppo non abbia
in un certo anno un importo, la riga mi viene con le colonne sfalsate,

es, supponi che il gruppo "9" non abbia valori per l'anno "2011",
visivamente mi vedrei il valore "22.77" della colonna 2010, spostato nella colonna 2011.

per cui ho modificato la funzione come di seguito:
PHP:
function _generaReport(){
    include 'Config_DB.php';  

    $Gruppi      = Table::Select("SELECT       DISTINCT gruppo_REF  AS Grp FROM movimenti ORDER BY Grp ASC");
    $countGruppi = Table::Select("SELECT COUNT(DISTINCT gruppo_REF) AS Nr  FROM movimenti");
    $sGruppo=$countGruppi[0]->Nr;

    $Anni      = Table::Select("SELECT       DISTINCT year(data)  AS Year FROM movimenti ORDER BY Year DESC");
    $countAnni = Table::Select("SELECT COUNT(DISTINCT year(data)) AS Nr   FROM movimenti");
    $sData=$countAnni[0]->Nr;


    $titoloFlag=true;

    $rowTitolo  = "<thead>".chr(10);
    $rowTitolo .= "  <tr role=\"row\">".chr(10);
    $rowTitolo .= "    <th class=\"colonna1\" >Gruppo</th>".chr(10);

    //questa matrice mi serve per poter gestire eventuali buchi,
    //cioè se un gruppo non ha un importo in un certo anno
    $matrix=array();

    for ($_gruppo=0; $_gruppo<$sGruppo; $_gruppo++){
        $matrix[$_gruppo]["IdGruppo"] =  $Gruppi[$_gruppo]->Grp;

        //aggiungo una colonna  per il totale (anno 9999)
        $matrix[$_gruppo]["9999"] =  " ";
        if($titoloFlag) $rowTitolo .= "    <th class=\"colonna3 center\" >TOTALE</th>".chr(10);

        for ($_data=0; $_data<$sData; $_data++){
            $matrix[$_gruppo][$Anni[$_data]->Year] = " ";
            if($titoloFlag) $rowTitolo .= "    <th class=\"colonnaAnno center\">".$Anni[$_data]->Year."</th>".chr(10);
        }
        $titoloFlag=false;
    }

    $rowTitolo .= "  </tr>".chr(10);
    $rowTitolo .= "</thead>".chr(10);


    $rows = count($matrix,0);
    $cols = (count($matrix,1)/count($matrix,0))-1;

    $sql="SELECT * FROM (
              SELECT gruppo_REF, 9999 AS anno, SUM(importo) AS importo FROM movimenti GROUP BY gruppo_REF
              UNION
              SELECT DISTINCT
                  gruppo_REF
                  ,YEAR(data) AS anno
                  ,(SELECT SUM(importo) FROM movimenti WHERE gruppo_REF=t.gruppo_REF AND YEAR(data)=YEAR(t.data)) importo
              FROM movimenti t
          ) x  ORDER BY x.gruppo_REF, x.anno DESC";

    $_sth = $db->query($sql);
    $_sth->setFetchMode( PDO::FETCH_ASSOC );

     while( $_row = $_sth->fetch() ){
        $importo  = number_format($_row['importo'], 2, ",", ".");

        for($rM=0; $rM< $rows; $rM++) {
            if($matrix[$rM]["IdGruppo"] == $_row['gruppo_REF']){
                $matrix[$rM][ $_row['anno'] ] =  $importo;
                 break ;
            }
        }
    }



    $rowTabella = "<tbody>".chr(10);

    for ($r=0; $r<$rows; $r++){
        $idRow = $matrix[$r]["IdGruppo"];
        $rowTabella .= "  <tr id=\"$idRow\" class=\"gruppo\">".chr(10);

        foreach ($matrix[$r] as $key => $valore){
            if($key == "IdGruppo"){
                // ricavo il nome del gruppo dalla relativa tabella
                $rowTabella .= "    <td class=\"\" >$matrix[$r]["IdGruppo"]</td>".chr(10);
            }
            else{
                $rowTabella .= "    <td class=\"center\">".$valore."</td>".chr(10);
            }
        }

        $rowTabella .= "  </tr>".chr(10);
   }

    $rowTabella .= "</tbody>".chr(10);



    return "<table>".$rowTitolo.$rowTabella."</table>";
}

siccome il tutto mi sembra molto complicato e un poco macchiavellico,
ti chiedo se con la tua esperienza mi potresti aiutare a semplificarlo?

grazie
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.039
146
63
PR
www.borgo-italia.it
ciao
prova così
PHP:
<?php
//.....
if($row['importo']!=""){
	$importo  = number_format($row['importo'], 2, ",", ".");
}else{//se l'importe è vuoto metti uno spazio per riempire la cella
	$importo="&nbsp;";
}
//...
?>
 

clodiny

Nuovo Utente
4 Nov 2015
27
0
0
se ti piace ....
PHP:
<?php

require_once 'Config_DB.php';

$sql="
select * from (
SELECT gruppo, 9999 as anno, sum(importo) as importo from tabpivot group by gruppo
union
SELECT distinct 
 gruppo
,year(data) as anno
,(select sum(importo) from tabpivot where gruppo=t.gruppo and year(data)=year(t.data)) importo
from tabpivot t
) x  order by x.gruppo, x.anno desc
";
.
.
.
?>
ciao
prova così
PHP:
<?php
//.....
if($row['importo']!=""){
	$importo  = number_format($row['importo'], 2, ",", ".");
}else{//se l'importe è vuoto metti uno spazio per riempire la cella
	$importo="*";
}
//...
?>
grazie Borgo italia

ho provato, ma non va, forse perché la query di Marino genera una tabella come questa:

gruppoannoimporto
79999453.98
72012190.17
72011158.25
72010105.56
9999945.78
9201223.01
9201022.77
119999257.00
112012168.50
11201169.00
11201019.50
13999988.20
13201237.40
13201120.00
13201030.80

che non ha importi nulli.
ma ad esempio nel gruppo 9 presenta un buco nell'anno 2011.

altre idee????

grazie a tutti
 

marino51

Utente Attivo
28 Feb 2013
2.708
140
63
Lombardia
con una piccola aggiunta, la query estrae anche le combinazioni che non esistono vedi 9, 2011
Codice:
select * from (
SELECT distinct gruppo, 9999 as anno
,(select sum(importo) from tabpivot where gruppo=t.gruppo) importo
from tabpivot t
union
SELECT distinct gruppo, year(data) as anno
,(select sum(importo) from tabpivot where gruppo=t.gruppo and year(data)=year(t.data)) importo
from tabpivot t
union
SELECT distinct t1.gruppo, year(t2.data)as anno, 0 as importo FROM tabpivot t1, tabpivot t2
where not exists (select 1 FROM tabpivot where gruppo=t1.gruppo and year(data)=year(t2.data))
) x  order by x.gruppo, x.anno desc
Cattura.PNG
 

clodiny

Nuovo Utente
4 Nov 2015
27
0
0
con una piccola aggiunta, la query estrae anche le combinazioni che non esistono vedi 9, 2011
Codice:
select * from (
SELECT distinct gruppo, 9999 as anno
,(select sum(importo) from tabpivot where gruppo=t.gruppo) importo
from tabpivot t
union
SELECT distinct gruppo, year(data) as anno
,(select sum(importo) from tabpivot where gruppo=t.gruppo and year(data)=year(t.data)) importo
from tabpivot t
union
SELECT distinct t1.gruppo, year(t2.data)as anno, 0 as importo FROM tabpivot t1, tabpivot t2
where not exists (select 1 FROM tabpivot where gruppo=t1.gruppo and year(data)=year(t2.data))
) x  order by x.gruppo, x.anno desc

grazie di tutto,

tutto funziona correttamente, l'unico neo è che con 1200 record da processare la query
provata in phpmyadmin impiega oltre 26 sec. tanto che in alcuni casi mi scatta il timeout dei 30 sec impostato in php.ini

mi parlavi di indicizzare "gruppo" e "data", io ho fatto come riportato nel post #13, ma non è migliorato molto, solo 24 sec.

hai qualche consiglio???
 
Ultima modifica: