SQLite - Transformar linhas em colunas

SQLite

13/04/2015

Olá pessoal!

No SQLite existe alguma função que seja capaz de transformar linhas em colunas?

Teria que ser um recurso semelhante ao PIVOT do Oracle...

select state_code, times_purchased, count(1) cnt
from customers
group by state_code, times_purchased;

CUST_ID STATE_CODE TIMES_PURCHASED
-------  ----------               ---------------
      1 CT                       1
      2 NY                      10
      3 NJ                       2
      4 NY                       4

--- com o uso do PIVOT

select * from (
   select times_purchased, state_code
   from customers t
)
pivot 
(
   count(state_code)
   for state_code in ('NY','CT','NJ','FL','MO')
)
order by times_purchased
/
Os dados de saída são apresentados assim: 
. TIMES_PURCHASED       'NY'       'CT'       'NJ'       'FL'       'MO'
       ---------------      ----------      ----------      ----------       ----------      ----------
              0      16601         90          0          0          0
              1      33048        165          0          0          0
              2      33151        179          0          0          0
              3      32978        173          0          0          0
              4      33109        173          0          1          0
...  
Marisiana Battistella

Marisiana Battistella

Curtidas 0

Respostas

Marisiana Battistella

Marisiana Battistella

13/04/2015

Alguém, sabe me informar se existe alguma função que transforme linhas em colunas no SQLite?
GOSTEI 0
Jothaz

Jothaz

13/04/2015

Atualmente acho muito mais viável, produtivo e performático efetuar este tratamento na aplicação. E digo isto por experiência, pois o projeto em que atuo hoje faz uso massivo deste procedimento.

Então é muito mais tranquilo serializar o resultado e utilizar o JavaScript, no caso uso o AngularJs para este tipo de operação. É rápido, desonera a rede e o servidor.

Agora cada caso é um caso, então dê uma olhada nestes link´s e veja se dá uma luz:

[url:descricao=SQLite-VirtualTable-Pivot-0.02 > SQLite::VirtualTable::Pivot]http://search.cpan.org/~bduggan/SQLite-VirtualTable-Pivot-0.02/lib/SQLite/VirtualTable/Pivot.pm[/url]

Pivot in SQLite

sqlite_pivot_tables.md

sqlite advanced - extract pivot table from db

[url:descricao=Produce a summary (“pivot”?) table]http://ask.webatall.com/sqlite/11309_produce-a-summary-pivot-table.html[/url]


Não usei nenhuma das soluções acima, então boa sorte e bons estudos.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

13/04/2015

Obrigada Jothaz!!
Olhei os links que você postou, e, eu acho, que a solução que preciso está no primeiro link:
[url]http://search.cpan.org/~bduggan/SQLite-VirtualTable-Pivot-0.02/lib/SQLite/VirtualTable/Pivot.pm[/url]
GOSTEI 0
Jothaz

Jothaz

13/04/2015

Que bom que os link tenham alguma utilidade.

A andei pesquisando bastante sobre transformar linhas em colunas.

Boa sorte!
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

13/04/2015

Obrigada!
Eu vi que há duas alternativas que retornam os dados da mesma forma quando utilizamos o CASE para transformar linhas em colunas no Oracle e no PostgreSQL.
Uma dessas alternativas é o próprio CASE que, também, existe no SQLite, e a outra é utilizando JOIN como nesse exemplo:
select
    u.stuid,
    u.name,
    s3.marks as subjectid_3,
    s4.marks as subjectid_4,
    s5.marks as subjectid_5
from
    student_temp u
    left outer join markdetails s3 on
        u.stuid = s3.stuid
        and s3.subjectid = 3
    left outer join markdetails s4 on
        u.stuid = s4.stuid
        and s4.subjectid = 4
    left outer join markdetails s5 on
        u.stuid = s5.stuid
        and s5.subjectid = 5

Mas essa "forma" é útil apenas quando se sabe exatamente quantas linhas irão se tornar colunas.
GOSTEI 0
Marcos P

Marcos P

13/04/2015

Marisiana,

Se a ideia é fazer esse pivot para usar em outro procedimento do lado do próprio banco de dados, tudo bem resolver do lado do SQLITE.

Agora, se a ideia é fazer isso para uso pela aplicação, siga a dica do Jothas e trate direto no programa... é mais fácil e mais rápido para todo o ambiente !
GOSTEI 0
Jothaz

Jothaz

13/04/2015

Obrigada!
Eu vi que há duas alternativas que retornam os dados da mesma forma quando utilizamos o CASE para transformar linhas em colunas no Oracle e no PostgreSQL.
Uma dessas alternativas é o próprio CASE que, também, existe no SQLite, e a outra é utilizando JOIN como nesse exemplo:
select
    u.stuid,
    u.name,
    s3.marks as subjectid_3,
    s4.marks as subjectid_4,
    s5.marks as subjectid_5
from
    student_temp u
    left outer join markdetails s3 on
        u.stuid = s3.stuid
        and s3.subjectid = 3
    left outer join markdetails s4 on
        u.stuid = s4.stuid
        and s4.subjectid = 4
    left outer join markdetails s5 on
        u.stuid = s5.stuid
        and s5.subjectid = 5

Mas essa "forma" é útil apenas quando se sabe exatamente quantas linhas irão se tornar colunas.


Exatamente onde empaquei, quando estava pesquisando sobre o assunto! kkkk
Se você precisa de algo dinâmico, então a saída é o PIVOT, ai ficamos presos ao SQL Server.
E mesmo a solução so PIVOT com colunas dinâmicas me parece uma gambiarra. kkk

Um forma de contornar é através de Cursores, mas ai também acho que começa a complicar e ir pela trilha da gambiarra. kkk

Ressalto que, a não ser que seja uma condição "sine qua non", o tratamento na aplicação só traz benefícios. No caso optei pelo AngularJS, mas pode ser feita em todas a linguagens atualmente e sempre vai haver ganho.

E tratando na aplicação você fica independente do banco de dados o que, para mim é um bônus.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

13/04/2015

Eu queria mesmo era descobrir se exista algum recurso no SQLite que faz o mesmo que o PIVOT faz, porque me questionaram se existia algum recurso pra fazer isso.
Não trabalho com o SQLite mas como trabalho com análise de dados sempre me perguntam alguma dica ou ajuda.
Sempre tento ajudar os colegas porque sempre acabo aprendendo com isso!!
Então a dica que vocês me passaram é fundamental, vou saber repassar ela para quem me pediu...
Obrigada! =D
GOSTEI 0
POSTAR