Fórum SQLite - Transformar linhas em colunas #516559
13/04/2015
0
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
Curtir tópico
+ 0Posts
14/04/2015
Marisiana Battistella
Gostei + 0
14/04/2015
Jothaz
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
14/04/2015
Marisiana Battistella
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
14/04/2015
Jothaz
A andei pesquisando bastante sobre transformar linhas em colunas.
Boa sorte!
Gostei + 0
14/04/2015
Marisiana Battistella
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 = 5Mas essa "forma" é útil apenas quando se sabe exatamente quantas linhas irão se tornar colunas.
Gostei + 0
14/04/2015
Marcos P
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
14/04/2015
Jothaz
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 = 5Mas 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
14/04/2015
Marisiana Battistella
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
Clique aqui para fazer login e interagir na Comunidade :)