Generar un gráfico con dos consultas mysql en la misma tabla

Tengo un problema al generar un gráfico con Highcharts, necesito hacer la consulta a una tabla en donde registro las ventas, y que me muestre en el gráfico las ventas por sucursal, y por día del mes.

Tengo el siguiente código para realizar las consultas:

//Sucursal uno
$sql = "SELECT day(created_at) AS dias, Sum(total) AS total_dias FROM sell WHERE Year(created_at)=Year(NOW()) AND Month(created_at)=Month(NOW()) AND operation_type_id=2 AND sucursal=3 GROUP BY dias ORDER BY dias asc";
$result_dia1 = mysqli_query($connection, $sql) or die("Error " . mysqli_error($connection));
$valores_dia1  = array();
while($row = mysqli_fetch_array($result_dia1))
{
    $valores_dia1["total_dias"][]=$row[1];
    $valores_dia1["dias"][]=$row[0];
}
//Sucursal dos
$sql = "SELECT day(created_at) AS dias, Sum(total) AS total_dias FROM sell WHERE Year(created_at)=Year(NOW()) AND Month(created_at)=Month(NOW()) AND operation_type_id=2 AND sucursal=5 GROUP BY dias ORDER BY dias asc";
$result_dia2 = mysqli_query($connection, $sql) or die("Error " . mysqli_error($connection));
$valores_dia2  = array();
while($row = mysqli_fetch_array($result_dia2))
{
    $valores_dia2["total_dias"][]=$row[1];
    $valores_dia2["dias"][]=$row[0];
}
$valores_dia_json1= preg_replace( "/\"(\d+)\"/", '$1', json_encode($valores_dia1, JSON_NUMERIC_CHECK));
$valores_dia_json2= preg_replace( "/\"(\d+)\"/", '$1', json_encode($valores_dia2, JSON_NUMERIC_CHECK));

El problema es que con este código me da los resultados por separado y al tratar de ponerlos en el gráfico no me pone los valores en los días correctos si en una sucursal no se ha vendido nada algún día, no se si me explico.

1 Respuesta

Respuesta
1

Que valor muestra el codigo cuando no se ha vendido nada, porque en caso de ser null, solo debes crear una condición que en caso de ser null sea X por ejemplo, donde X es el valor que tu quieras

Hola Johan Montiel, lo que pasa es que el valor me lo pone en el día incorrecto, tengo que sacar las ventas por días de dos sucursales, y mostrarlas en el gráfico según el día, como te lo muestro en ala siguiente imagen:

la parte en azul es la sucursal 1, y la negra la sucursal 2, el problema es que me pone las ventas de la sucursal 2 desde el primer día del mes y no desde el día que se ha realizado las ventas, en el gráfico debería estar las ventas de la sucursal dos a partir del día 15 ya que del 1 al 15 no se realizaron ventas, pero no me la pone así.

Haz un print de

$valores_dia_json1
$valores_dia_json2

El código para el gráfico es el siguiente:

        <script type="text/javascript">
            var meses = new Array ("Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre");
            var f=new Date();
            var val_anio =  eval('('+'<?php echo date('Y'); ?>'+')');
            var val_mes =  meses[f.getMonth()];
            var valores_dia1 =  eval('('+'<?php echo $valores_dia_json1; ?>'+')');
            var valores_dia2 =  eval('('+'<?php echo $valores_dia_json2; ?>'+')');
            $(function () {
                $('#container_2').highcharts({
                    chart: {
                        type: 'column'
                    },
                    title: {
                        text: 'Ventas por día del Mes de ' + val_mes
                    },
                    xAxis: {
                        categories: valores_dia1["dias"],
                    },
                    yAxis: {
                        min: 0,
                        title: {
                            text: 'Dolares (USD)'
                        },
                        stackLabels: {
                            enabled: true,
                            style: {
                                fontWeight: 'bold',
                                color: (Highcharts.theme && Highcharts.theme.textColor) || 'gray'
                            }
                        }
                    },
                    legend: {
                        align: 'right',
                        x: -30,
                        verticalAlign: 'top',
                        y: 25,
                        floating: true,
                        backgroundColor: (Highcharts.theme && Highcharts.theme.background2) || 'white',
                        borderColor: '#CCC',
                        borderWidth: 1,
                        shadow: false
                    },
                    tooltip: {
                        headerFormat: '<b>{point.x}</b><br/>',
                        pointFormat: '{series.name}: {point.y} usd<br/>Total: {point.stackTotal} usd'
                    },
                    plotOptions: {
                        column: {
                            stacking: 'normal',
                            dataLabels: {
                                enabled: true,
                                color: (Highcharts.theme && Highcharts.theme.dataLabelsColor) || 'white',
                                style: {
                                    textShadow: '0 0 3px black'
                                }
                            }
                        }
                    },
                    series: [{
                        name: 'Sucursal 1',
                        data: valores_dia1["total_dias"]
                    }, {
                        name: 'Sucursal 2',
                        data: valores_dia2["total_dias"]
                    }]
                });
            });
        </script>
    

Espero que sea lo que me pides, muchas gracias por tu ayuda

No es eso, es esto

¿
<?php 
echo $valores_dia_json1;
echo $valores_dia_json2; 
?>

Osea que me digas exactamente que muestra allí ejemplo array(0,12.3,0)

Perdona el resultado del array es:

valores_dia_json1: {"total_dias":[105,155.5,350.25,402,178.75,90.5,69.75,75,99,344,403.5,74,32,44,72.5,105,320.75,421,65,49,47,69.5,120,300.25,338.5,35],"dias":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]}

valores_dia_json2: {"total_dias":[221,160.5,26,67.5,57,30,62.5,196,222.5,22.5],"dias":[17,18,19,20,21,22,23,24,25,26]}

Es como te dije crea una condición que si no hay ventas genere 0, quedaría algo como

valores_dia_json1: {"total_dias":[105,155.5,350.25,402,178.75,90.5,69.75,75,99,344,403.5,74,32,44,72.5,105,320.75,421,65,49,47,69.5,120,300.25,338.5,35],"dias":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]}

valores_dia_json2: {"total_dias":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,221,160.5,26,67.5,57,30,62.5,196,222.5,22.5],"dias":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]}

Eso es lo que quiero pero no doy como crear la condición, lo intenté en el código del gráfico pero no me resultó.

Eso debes hacerlo es en el primer código que enviaste con la pregunta, osea en la consulta.

Te doy una idea para que lo hagas tu, puedes crear un while con los días del 1 al actual y vas revisando si la consulta tiene datos, si no colocas 0

Precisamente eso es lo que no se como hacer pero ¡GRACIAS! de todas maneras por tu ayuda...

Prueba así, yo no lo probé por no tener la BD, solo lo hice en Valores_dia2

¿

¿
<?php 
//Sucursal uno
$sql = "SELECT day(created_at) AS dias, Sum(total) AS total_dias FROM sell WHERE Year(created_at)=Year(NOW()) AND Month(created_at)=Month(NOW()) AND operation_type_id=2 AND sucursal=3 GROUP BY dias ORDER BY dias asc";
$result_dia1 = mysqli_query($connection, $sql) or die("Error " . mysqli_error($connection));
$valores_dia1  = array();
while($row = mysqli_fetch_array($result_dia1))
{
    $valores_dia1["total_dias"][]=$row[1];
    $valores_dia1["dias"][]=$row[0];
}
//Sucursal dos
$sql = "SELECT day(created_at) AS dias, Sum(total) AS total_dias FROM sell WHERE Year(created_at)=Year(NOW()) AND Month(created_at)=Month(NOW()) AND operation_type_id=2 AND sucursal=5 GROUP BY dias ORDER BY dias asc";
$result_dia2 = mysqli_query($connection, $sql) or die("Error " . mysqli_error($connection));
$valores_dia2  = array();
while($row = mysqli_fetch_array($result_dia2))
{
    $day = 1;
    if($row[0]>$day) {
        while($row[0]>$day){
         $valores_dia2["total_dias"][]=0;
         $valores_dia2["dias"][]=$day;
         $day++;           
        }
    }
    $valores_dia2["total_dias"][]=$row[1];
    $valores_dia2["dias"][]=$row[0];
    $day = $row[0] + 1;
}
$valores_dia_json1= preg_replace( "/\"(\d+)\"/", '$1', json_encode($valores_dia1, JSON_NUMERIC_CHECK));
$valores_dia_json2= preg_replace( "/\"(\d+)\"/", '$1', json_encode($valores_dia2, JSON_NUMERIC_CHECK));
?>

Me da un total de 207 días en el mes:

Es difícil lograr ver el error así, haz nuevamente un print de

¿

¿
<?php 
echo $valores_dia_json1;
echo $valores_dia_json2; 
?>

Creo que ya vi el error prueba así

¿

¿
<?php 
//Sucursal uno
$sql = "SELECT day(created_at) AS dias, Sum(total) AS total_dias FROM sell WHERE Year(created_at)=Year(NOW()) AND Month(created_at)=Month(NOW()) AND operation_type_id=2 AND sucursal=3 GROUP BY dias ORDER BY dias asc";
$result_dia1 = mysqli_query($connection, $sql) or die("Error " . mysqli_error($connection));
$valores_dia1  = array();
while($row = mysqli_fetch_array($result_dia1))
{
    $valores_dia1["total_dias"][]=$row[1];
    $valores_dia1["dias"][]=$row[0];
}
//Sucursal dos
$sql = "SELECT day(created_at) AS dias, Sum(total) AS total_dias FROM sell WHERE Year(created_at)=Year(NOW()) AND Month(created_at)=Month(NOW()) AND operation_type_id=2 AND sucursal=5 GROUP BY dias ORDER BY dias asc";
$result_dia2 = mysqli_query($connection, $sql) or die("Error " . mysqli_error($connection));
$valores_dia2  = array();
$day = 1;
while($row = mysqli_fetch_array($result_dia2))
{
    if($row[0]>$day) {
        while($row[0]>$day){
         $valores_dia2["total_dias"][]=0;
         $valores_dia2["dias"][]=$day;
         $day++;           
        }
    }
    $valores_dia2["total_dias"][]=$row[1];
    $valores_dia2["dias"][]=$row[0];
    $day = $row[0] + 1;
}
$valores_dia_json1= preg_replace( "/\"(\d+)\"/", '$1', json_encode($valores_dia1, JSON_NUMERIC_CHECK));
$valores_dia_json2= preg_replace( "/\"(\d+)\"/", '$1', json_encode($valores_dia2, JSON_NUMERIC_CHECK));
?>

¡Muchísimas Gracias! por tu tiempo y ayuda Johan Montiel, quedo perfecto.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas