Welcome Guest, Not a member yet? Register   Sign In
Problem with query on sqlsrv
#5

It's quite strange situation... maybe sql query is generated from some third-party service (via some sort of api) and must be executed dynamically?
I'm not sure...


Based on the sql query from the first post I manage to write a very simple (and ugly) helper for query modification. It won't cover all the possibilities but hey... it's a start.

PHP Code:
function prepare_columns($str)
{
    if (preg_match('/SELECT (.*?) FROM/'$str$match) !== 1)
    {
        return $str;
    }

    $columns array_map('trim'explode(','$match[1]));

    foreach ($columns as $key => &$col)
    {
        if (substr($col, -1) === ')')
        {
            $col .= ' AS column_' . ++$key;
        }
        else
        
{
            $words explode(' '$col);
            if (strtolower($words[count($words) - 2]) !== 'as')
            {
                $col .= ' AS column_' . ++$key;
            }
        }
    }

    return str_replace($match[1], implode(','$columns), $str);


Usage:
PHP Code:
$sql "SELECT cast(VENDAS_ANO_ATUAL as money),cast(VENDAS_ANO_ANTERIOR as money), cast(cast(CASE WHEN VENDAS_ANO_ANTERIOR = 0 THEN 0 ELSE ((VENDAS_ANO_ATUAL - VENDAS_ANO_ANTERIOR) / VENDAS_ANO_ANTERIOR) * 100 END as int) as varchar) + '%' AS PERCENTAGEM, case when VENDAS_ANO_ANTERIOR < VENDAS_ANO_ATUAL then '' else case when VENDAS_ANO_ANTERIOR> VENDAS_ANO_ATUAL then '' else '' end end FROM ( SELECT SUM(CASE WHEN Ano = YEAR(GETDATE()) THEN TotalLiqMBase ELSE 0 END) AS VENDAS_ANO_ATUAL, SUM(CASE WHEN Ano = YEAR(GETDATE())-1 THEN TotalLiqMBase ELSE 0 END) AS VENDAS_ANO_ANTERIOR FROM AcumuladosVendas (NOLOCK) JOIN DocumentosVenda ON DocumentosVenda.Documento=AcumuladosVendas.TipoDoc WHERE AcumuladosVendas.VENDEDOR IN (1) AND DocumentosVenda.TipoDocumento = 4 ) AS DATA";

echo 
prepare_columns($sql); 

This will produce:
Code:
SELECT cast(VENDAS_ANO_ATUAL as money) AS column_1,cast(VENDAS_ANO_ANTERIOR as money) AS column_2,cast(cast(CASE WHEN VENDAS_ANO_ANTERIOR = 0 THEN 0 ELSE ((VENDAS_ANO_ATUAL - VENDAS_ANO_ANTERIOR) / VENDAS_ANO_ANTERIOR) * 100 END as int) as varchar) + '%' AS PERCENTAGEM,case when VENDAS_ANO_ANTERIOR < VENDAS_ANO_ATUAL then '' else case when VENDAS_ANO_ANTERIOR> VENDAS_ANO_ATUAL then '' else '' end end AS column_4 FROM ( SELECT SUM(CASE WHEN Ano = YEAR(GETDATE()) THEN TotalLiqMBase ELSE 0 END) AS VENDAS_ANO_ATUAL, SUM(CASE WHEN Ano = YEAR(GETDATE())-1 THEN TotalLiqMBase ELSE 0 END) AS VENDAS_ANO_ANTERIOR FROM AcumuladosVendas (NOLOCK) JOIN DocumentosVenda ON DocumentosVenda.Documento=AcumuladosVendas.TipoDoc WHERE AcumuladosVendas.VENDEDOR IN (1) AND DocumentosVenda.TipoDocumento = 4 ) AS DATA
Reply


Messages In This Thread
Problem with query on sqlsrv - by renatoribeiro - 09-13-2018, 02:16 AM
RE: Problem with query on sqlsrv - by php_rocs - 09-13-2018, 07:32 AM
RE: Problem with query on sqlsrv - by ciadmin - 09-13-2018, 09:52 AM
RE: Problem with query on sqlsrv - by michalsn - 09-13-2018, 10:22 AM
RE: Problem with query on sqlsrv - by php_rocs - 09-13-2018, 01:09 PM
RE: Problem with query on sqlsrv - by michalsn - 09-14-2018, 10:54 AM



Theme © iAndrew 2016 - Forum software by © MyBB