Concatenate columns in rows

5

I'm trying to grab multiple columns and turn them into single line, but to no avail.

This is the select I'm trying to do:

SELECT ('dias2produto'+'dias4produto') as 'Até 4 dias', round(((('dias2produto'+'dias4produto')*100)/'total_produto'),2) as percentual_4dias,
       ('dias7produto') as 'De 5 à 7 dias', round((('dias7produto'*100)/'total_produto'),2) as percentual_7dias,
       ('dias21produto') as 'De 8 à 21 dias', round((('dias21produto'*100)/'total_produto'),2) as percentual_21dias,
       ('dias28produto') as 'De 22 à 28 dias', round((('dias28produto'*100)/'total_produto'),2) as percentual_28dias,
       ('dias60produto') as 'De 29 à 60 dias', round((('dias60produto'*100)/'total_produto'),2) as percentual_60dias,
       ('dias_endproduto') as 'Mais de 60 dias', round((('dias_endproduto'*100)/'total_produto'),2) as percentual_m60dias,
       'total_produto'

I tried doing it using group_concat, but it put everything on a single line and not on separate lines. I also tried to find out about Pivot, but I did not understand how to use it.

The expected result is this here:

I appreciate your attention, but I have been able to solve my problem in another way:

SELECT
    CASE    WHEN FN_DIFF_DAYS( DATE( t.created ), DATE( f.vencimento )) > 0  AND FN_DIFF_DAYS( DATE( t.created ), DATE( f.vencimento )) <= 2 THEN 'Até 4 dias'
            WHEN FN_DIFF_DAYS( DATE( t.created ), DATE( f.vencimento )) > 2 AND FN_DIFF_DAYS( DATE( t.created ), DATE( f.vencimento )) <= 4 THEN 'Até 4 dias'    
            WHEN FN_DIFF_DAYS( DATE( t.created ), DATE( f.vencimento )) > 4 AND FN_DIFF_DAYS( DATE( t.created ), DATE( f.vencimento )) <= 7 THEN 'De 5 à 7 dias' 
            WHEN FN_DIFF_DAYS( DATE( t.created ), DATE( f.vencimento )) > 7 AND FN_DIFF_DAYS( DATE( t.created ), DATE( f.vencimento )) <= 21 THEN 'De 8 à 21 dias'  
            WHEN FN_DIFF_DAYS( DATE( t.created ), DATE( f.vencimento )) > 21 AND FN_DIFF_DAYS( DATE( t.created ), DATE( f.vencimento )) <= 28 THEN 'De 22 à 28 dias' 
            WHEN FN_DIFF_DAYS( DATE( t.created ), DATE( f.vencimento )) > 28 AND FN_DIFF_DAYS( DATE( t.created ), DATE( f.vencimento )) <= 60 THEN 'De 29 à 60 dias'     
            WHEN FN_DIFF_DAYS( DATE( t.created ), DATE( f.vencimento )) > 60 AND FN_DIFF_DAYS( DATE( t.created ), DATE( f.vencimento )) <= 1000000 THEN 'Mais de 60 dias'
            ELSE 0 END AS 'Prazo' ,      
    sum(( f.product_adults + f.product_children + f.product_baby )) AS 'Quantidade Geral de Produto',
    sum(tpf.qt_produto) as qt_produto

I was able to get a little bit of each tip here and formulate my result.

    
asked by anonymous 22.08.2018 / 17:12

1 answer

9

If you want line by line, the path is UNION

SELECT SUM('dias2produto'+'dias4produto') AS 'Até 4 dias',
       SUM(ROUND(((('dias2produto'+'dias4produto')*100)/'total_produto'),2)) as p4d
UNION
SELECT SUM('dias7produto') as 'De 5 à 7 dias',
       SUM(ROUND((('dias7produto'*100)/'total_produto'),2) as percentual_7dias
UNION
-- faça novo SELECT para cada linha, com um UNION entre eles --

To get the totals of each select, not row by line, we use SUM, which is an aggregate function.

  • SUM to sum all rows

  • AVG to find the mean

  • MAX to get the highest value

  • MIN to get the lowest

There are others:

  

link

In your case:

SELECT SUM('dias2produto'+'dias4produto') as 'Até 4 dias',
       SUM(ROUND(((dias2produto+dias4produto)*100)/SUM('total_produto'),2)) as perc_4dias,
       SUM('dias7produto') as 'De 5 à 7 dias',
       -- faça isso em todos os casos, note o SUM aqui no total ^tambem ^^^^

You can write more than one way:

round(((SUM(dias2produto)+SUM(dias4produto)*100)/SUM('total_produto'),2) as perc_4dias,
      --^^^               ^^^                    ^^^ agrupando campos
round(((SUM(dias2produto+dias4produto)*100)/SUM('total_produto'),2) as perc_4dias,
      --^^^                                 ^^^ agrupando partes
SUM(round((((dias2produto+dias4produto)*100)/'total_produto',2)) as perc_4dias,
--^ agrupando tudo


If you need to, you can control aggregation with GROUP BY . You can unite the two things this way:

SELECT SUM( salario ) GROUP BY YEAR( data )

In this case you will have the totals, but separate one row per year instead of one row.

    
22.08.2018 / 17:41