How to translate this query to the CodeIgniter query builder?

0

I'm having trouble putting this query in CodeIgniter, can anyone help?

select 
    venda_itens.secao, venda_itens.secao_nome,
    sum(venda_itens.qtd_itens_finalizada) as qtd_itens,
    sum(venda_itens.qtd_itens_cancelada) as qtd_itens_cancelados,
    sum(case when venda_itens.preco_desconto_cancelada is not null then 
            venda_itens.preco_desconto_cancelada else venda_itens.preco_total_cancelada end) as valor_canceladas,
    sum(case when venda_itens.preco_desconto_finalizada is not null 
    then venda_itens.preco_desconto_finalizada else venda_itens.preco_total_finalizada end) as valor_total
    from vendas as v
    join (
    select 
    v.id as venda_id,
    v.status,
    vi.secao, vi.secao_nome,
    sum(case when v.status = "finalizada" then vi.quantidade end) as qtd_itens_finalizada,
    sum(case when v.status = "cancelada" then vi.quantidade end) as qtd_itens_cancelada,
    sum(case when v.status = "finalizada" then vi.preco_desconto end) as preco_desconto_finalizada,
    sum(case when v.status = "finalizada" then vi.preco_total end) as preco_total_finalizada,
    sum(case when v.status = "cancelada" then vi.preco_desconto end) as preco_desconto_cancelada,
    sum(case when v.status = "cancelada" then vi.preco_total end) as preco_total_cancelada
    from vendas as v
    join vendas_itens as vi on vi.vendas_id = v.id
    where (v.data_venda between '2018-04-02 00:00:00' and '2018-04-02 23:59:59')
    and (vi.secao between 1 and 30)
    group by vi.secao
    ) as venda_itens on venda_itens.venda_id = v.id
    where (v.data_venda between '2018-04-02 00:00:00' and '2018-04-02 23:59:59')
    and (venda_itens.secao between 1 and 30)
    group by venda_itens.secao
    order by v.data_venda desc, venda_itens.secao;
    
asked by anonymous 02.04.2018 / 19:22

1 answer

0

The solution I found to use the query with the CodeIgniter query builder, using the date and section dynamically. If someone has a better solution, just comment.

public function resumo_secao($data)
    {
        $where = '';

        if (
            !empty($data['data_inicial']) &&
            !empty($data['data_final']) &&
            !empty($data['secao_inicial']) &&
            !empty($data['secao_final'])
        ) {
            $where =
                'where (v.data_venda between "' . $data['data_inicial'] . '" and "' . $data['data_final'] . '") and 
                (vi.secao between ' . $data['secao_inicial'] . ' and ' . $data['secao_final'] . ')';
        } elseif (
            !empty($data['data_inicial']) &&
            !empty($data['data_final'])) {
            $where =
                'where (v.data_venda between "' . $data['data_inicial'] . '" and "' . $data['data_final'] . '")';
        } elseif (
            !empty($data['secao_inicial']) &&
            !empty($data['secao_final'])
        ) {
            $where =
                'where (vi.secao between ' . $data['secao_inicial'] . ' and ' . $data['secao_final'] . ')';
        }

        $this->db->select('
            venda_itens.secao, venda_itens.secao_nome,
            sum(venda_itens.qtd_itens_finalizada) as qtd_itens,
            sum(venda_itens.qtd_itens_cancelada) as qtd_itens_cancelados,
            sum(case when venda_itens.preco_desconto_cancelada is not null then 
             venda_itens.preco_desconto_cancelada else venda_itens.preco_total_cancelada end) as valor_canceladas,
            sum(case when venda_itens.preco_desconto_finalizada is not null 
             then venda_itens.preco_desconto_finalizada else venda_itens.preco_total_finalizada end) as valor_total
        ');
        $this->db->from('vendas v');
        $this->db->join('
        (select
        v.id as venda_id,
        v.status,
        vi.secao, vi.secao_nome,
        sum(case when v.status = "finalizada" then vi.quantidade end) as qtd_itens_finalizada,
        sum(case when v.status = "cancelada" then vi.quantidade end) as qtd_itens_cancelada,
        sum(case when v.status = "finalizada" then vi.preco_desconto end) as preco_desconto_finalizada,
        sum(case when v.status = "finalizada" then vi.preco_total end) as preco_total_finalizada,
        sum(case when v.status = "cancelada" then vi.preco_desconto end) as preco_desconto_cancelada,
        sum(case when v.status = "cancelada" then vi.preco_total end) as preco_total_cancelada
        from vendas as v
        join vendas_itens as vi on vi.vendas_id = v.id
        ' . $where . '
        group by vi.secao
        ) as venda_itens
        ', 'venda_itens.venda_id = v.id', 'inner', null);
        if (!empty($data['data_inicial']) && !empty($data['data_final'])) {
            $this->db->where('v.data_venda >=', $data['data_inicial']);
            $this->db->where('v.data_venda <=', $data['data_final']);
        }
        if (!empty($data['secao_inicial']) && !empty($data['secao_final'])) {
            $this->db->where('venda_itens.secao >=', $data['secao_inicial']);
            $this->db->where('venda_itens.secao <=', $data['secao_final']);
        }
        $this->db->where('v.status =', 'finalizada');
        $this->db->group_by('venda_itens.secao');
        $this->db->order_by('qtd_itens', 'desc');
        $this->db->order_by('v.data_venda', 'desc');
        $this->db->order_by('venda_itens.secao');
        $this->db->limit(60);
        $response = $this->db->get();
        return $response->result();
    }
    
04.04.2018 / 14:38