Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > PHP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-08-2018
Jose Manuel Jose Manuel is offline
Miembro
 
Registrado: may 2003
Posts: 112
Poder: 22
Jose Manuel Va por buen camino
Gracia por tu respuesta,

Esta instrucción, es similar a una de las que he probado.

Código PHP:
$select=$db->prepare('
SELECT MonthName(f_fecha) as Month, year(f_fecha) as Year, sum(n_importe) as n_importe 
FROM contabilidad  
Group By YEAR(f_fecha), Month(f_fecha)'
)    ; 
Creo que para obtener lo que quiero deberia incluir un subselect para que me creará el campo del año actual.

Pongo una imagen de lo que sale con ambas instrucciones y lo que yo quiero conseguir.



muestro el codigo y la tabla donde quiero ponerlo.
Código PHP:
$select=$db->prepare('
SELECT MonthName(f_fecha) as Month, year(f_fecha) as Year, sum(n_importe) as n_importe FROM contabilidad WHERE  n_importe<0 and year(f_fecha)=2017 Group By YEAR(f_fecha), Month(f_fecha)
union all
SELECT MonthName(f_fecha) as Month, year(f_fecha) as Year, sum(n_importe) as n_importe FROM contabilidad WHERE  n_importe<0 and year(f_fecha)=2018 Group By YEAR(f_fecha), Month(f_fecha)'
);
        
$select->execute();    
foreach (
$select as $row) {
echo 
"<tr>"
echo 
"<td>" $row['Month'] . "</td>";
echo 
"<td>" .number_format($row['n_importe'], 2',''.')."</td>";
echo 
"<td>" .number_format($row['n_importe2'], 2',''.')."</td>";    // me falta este campo
echo "</tr>";     

Responder Con Cita
  #2  
Antiguo 12-08-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.052
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Una búsqueda por 'pivot' te dará una idea de cómo es.
Responder Con Cita
  #3  
Antiguo 12-08-2018
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.912
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
El problema de casi el 100% de todas las preguntas sobre SQL es la falta de los datos ORIGINALES. Siempre muestran el resultado, no de donde sale eso:

http://www.galeon.com/neoprogramadores/ch1taoup.htm

Cita:
Muéstrame tus diagramas de flujo y esconde tus tablas y continuaré desconcertado, muéstrame tus tablas y usualmente no necesitaré tus diagramas de flujo; ellos serán obvios.

The Mythical Man-Month / Fred Brooks
__________________
El malabarista.
Responder Con Cita
  #4  
Antiguo 12-08-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.052
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por mamcx Ver Mensaje
El problema de casi el 100% de todas las preguntas sobre SQL es la falta de los datos ORIGINALES. Siempre muestran el resultado, no de donde sale eso:

http://www.galeon.com/neoprogramadores/ch1taoup.htm
Responder Con Cita
  #5  
Antiguo 13-08-2018
Jose Manuel Jose Manuel is offline
Miembro
 
Registrado: may 2003
Posts: 112
Poder: 22
Jose Manuel Va por buen camino
Thumbs up

Hola, el origen de la consulta es que tengo una tabla llamada contabilidad, con la siguiente estructura

Código PHP:
CREATE TABLE `contabilidad` (
  `
n_idint(11NOT NULL,
  `
n_id_comunidadestinyint(4NOT NULL,
  `
n_id_gruposint(11NOT NULL,
  `
f_fechadate NOT NULL,
  `
c_conceptovarchar(150COLLATE utf8_unicode_ci NOT NULL,
  `
n_importedecimal(12,2NOT NULL,
  `
n_saldodecimal(12,2NOT NULL,
  `
f_registrodate NOT NULL
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
Esta tabla es un diario contable con registros de varios años, y lo que pretendía hacer con una consulta SQL era obtener el resumen de los gastos agrupado por meses del año actual y anterior, para mostrarlo en una tabla.

Al final lo conseguido pasando los resultados de las 4 consultas (GASTOS mensuales año actual, GASTOS mensuales año anterior, INGRESOS mensuales año actual, INGRESOS mensuales año anterior), a un Array() y después los he puesto en una tabla, el resultado es el de esta imagen.


El codigo PHP PDO que he utilizado es el siguiente:
Código PHP:
        <?php  
        $hoy 
getdate();       //array datos sistema para obtener el año.;
                
require_once('conexion.php');
        
$db=Db::conectar();    

        
// gastos año anterior
        
$select=$db->prepare('
        select Month(f_fecha) as Month, sum(n_importe) as n_importe from contabilidad WHERE YEAR(f_fecha) =:yearAnterior and n_importe<0 Group By Month'
);
        
$select->bindValue('yearAnterior',$hoy['year']-1);
        
$select->execute();        
        
$año_anterior $select->fetchAll(PDO::FETCH_ASSOC);

        
// gastos año actual        
        
$select=$db->prepare('
        select count(*), Month(f_fecha) as Month, sum(n_importe) as n_importe from contabilidad where YEAR(f_fecha) =:yearActual and n_importe<0 Group By Month'
);
        
$select->bindValue('yearActual',$hoy['year']);        
        
$select->execute();    
                
$año_actual $select->fetchAll(PDO::FETCH_ASSOC);    
        
$filas=$select->rowCount(); // obtenemos el nº de filas recibidas        
        // rellenamos con cero el array de los meses que no hay datos
        
for($i=$filas;$i<12;$i++) {    
        
$año_actual[$i]['Month']=$i;
                
$año_actual[$i]['n_importe']=0.00;        
        }       

        
// ingresos año anterior
        
$select=$db->prepare('
        select Month(f_fecha) as Month, sum(n_importe) as n_importe from contabilidad WHERE YEAR(f_fecha) =:yearAnterior and n_importe>=0 Group By Month'
);
        
$select->bindValue('yearAnterior',$hoy['year']-1);
        
$select->execute();        
        
$i_año_anterior $select->fetchAll(PDO::FETCH_ASSOC);
        
        
// ingresos año actual
        
$select=$db->prepare('
        select count(*), Month(f_fecha) as Month, sum(n_importe) as n_importe from contabilidad where YEAR(f_fecha) =:yearActual and n_importe>=0 Group By Month'
);
        
$select->bindValue('yearActual',$hoy['year']);        
        
$select->execute();    
                
$i_año_actual $select->fetchAll(PDO::FETCH_ASSOC);    
        
$filas=$select->rowCount(); // obtenemos el nº de filas recibidas        
        // rellenamos con cero el array de los meses que no hay datos
        
for($i=$filas;$i<12;$i++) {    
        
$i_año_actual[$i]['Month']=$i;
                
$i_año_actual[$i]['n_importe']=0.00;        
        }       
        echo 
"<div style='overflow-x:auto'>";
        echo 
"<table border='1' id='mitabla' >";
        echo 
"<thead>";
        echo 
"<tr>";
        echo 
"<th class='table-header' width='10%'>  </th>";
        echo 
"<th class='table-header' width='22%'>Gastos</th>";
        echo 
"<th class='table-header' width='22%'>Gastos</th>";
        echo 
"<th class='table-header' width='22%'>Ingresos</th>";
        echo 
"<th class='table-header' width='22%'>Ingresos</th>";        
        echo 
"</tr>";
        echo 
"</thead>";
            echo 
"<thead>";
        echo 
"<tr>";
        echo 
"<th>Mes</th>";
        echo 
"<th><div class='links'>              
              <a class='active' href='cta_bancaria.php'>"
.$hoy['year']."</a></th> </div>";    
        echo 
"<th><div class='links'>              
              <a class='active' href='cta_bancaria.php'>"
.($hoy['year']-1)."</a></th> </div>";
        echo 
"<th>".$hoy['year']."</th>";            
              echo 
"<th>".($hoy['year']-1)."</th>";
        echo 
"</tr>";
        echo 
"</thead>";   
            
                
$total_actual=0;
        
$total_anterior=0;    
                
$i_total_actual=0;
        
$i_total_anterior=0;    
        
$meses = array("-","Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre");
        
        for(
$i=0;$i<12;$i++) {    // recorremos el array. NOTA: debe haber datos en todos los items    
             
echo "<tbody>";
        echo 
"<tr>";
        echo 
"  <td> ".$meses[$año_anterior[$i]['Month']]."</td>";    
        
        echo 
"  <td ALIGN='right'> ".number_format($año_actual[$i]['n_importe'], 2',''.')."</td>";
        echo 
"  <td ALIGN='right'> ".number_format($año_anterior[$i]['n_importe'], 2',''.')."</td>";
        echo 
"  <td ALIGN='right'> ".number_format($i_año_actual[$i]['n_importe'], 2',''.')."</td>";
        echo 
"  <td ALIGN='right'> ".number_format($i_año_anterior[$i]['n_importe'], 2',''.')."</td>";
        echo 
"</tr>";    
            
        
$total_actual    $total_actual     $año_actual[$i]['n_importe'];
        
$total_anterior  $total_anterior   $año_anterior[$i]['n_importe'];
        
$i_total_actual  $i_total_actual   $i_año_actual[$i]['n_importe'];
        
$i_total_anterior$i_total_anterior $i_año_anterior[$i]['n_importe'];
            
        }        
        echo 
"<tr>";
                echo 
"  <td> TOTAL  </td>";        
        echo 
"  <td ALIGN='right'> ".number_format($total_actual2',''.')."</td>";                
        echo 
"  <td ALIGN='right'> ".number_format($total_anterior2',''.')."</td>";        
        echo 
"  <td ALIGN='right'> ".number_format($i_total_actual2',''.')."</td>";                
        echo 
"  <td ALIGN='right'> ".number_format($i_total_anterior2',''.')."</td>";        
        echo 
"</tr>";            
        
        echo 
"</tbody>";            
        echo 
"</tr>";                    
        echo 
"</table>";    
     echo 
"</div>";    
    
?>
No se si hay otra forma de realizarlo más eficaz, pero esta funciona bastante bien.

Un saludo y muchas gracias a todos.
Responder Con Cita
  #6  
Antiguo 13-08-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.052
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Jose Manuel Ver Mensaje
No se si hay otra forma de realizarlo más eficaz
Pues como te he indicado antes, con "pivot".
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Calcular EDAD en años, meses y dias de una Persona MaMu Trucos 6 02-09-2013 23:57:24
Contar y sumar importes de firebird MartinS SQL 4 09-07-2012 10:22:28
Cómo se determina la cantidad de años y meses.. ronimaxh Varios 4 07-05-2007 22:12:03
Consulta con meses y años Gabriel2 SQL 3 05-09-2005 18:31:56
agrupar por dias meses y años en Interbase????? mguixot Conexión con bases de datos 0 03-10-2003 19:31:08


La franja horaria es GMT +2. Ahora son las 09:04:55.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi