Consulta SQL - Crosstab
Estou com a seguinte necessidade:
- Tenho uma tabela com a seguinte estrutura:
Gostaria de fazer um select que me retornasse assim:
OBS: Ha algum tempo atras eu estava com uma duvida parecida e a mesma consegui resolver usando este comando sql ou uma storeprocedure que baixei na net chamada sp_crosstab
Resultado
Mas agora nao estou conseguindo o mesmo resultado acredito que e pq agora nao posso usar um sum() por se tratar de um campo string "TAMANHO"
- Tenho uma tabela com a seguinte estrutura:
CODIGO TAMANHO ----------- ------------------------- 1 PP 1 P 1 M 1 G 1 GG 1 XGG 1 BB
Gostaria de fazer um select que me retornasse assim:
CODIGO PP P M G GG XGG BB ----------- --- --- --- --- --- --- --- 1 0 0 0 0 0 0 0
OBS: Ha algum tempo atras eu estava com uma duvida parecida e a mesma consegui resolver usando este comando sql ou uma storeprocedure que baixei na net chamada sp_crosstab
select P.PRD_CODIGO, P.PRD_NOME, SUM(CASE FIL_CODIGO WHEN 1 THEN PRD_QTDATUAL ELSE 0 END) AS F1, SUM(CASE FIL_CODIGO WHEN 2 THEN PRD_QTDATUAL ELSE 0 END) AS F2, SUM(CASE FIL_CODIGO WHEN 3 THEN PRD_QTDATUAL ELSE 0 END) AS F3 from PRODUTOS P inner join PRDPADRAO QT on QT.PRD_CODIGO = P.PRD_CODIGO where P.PRD_CODIGO = 417 GROUP BY P.PRD_CODIGO, P.PRD_NOME
Resultado
PRD_CODIGO PRD_NOME F1 F2 F3 ---------- -------------- ----- ----- ----- 417 KIT CONFIANCA 0.000 0.000 0.000
Mas agora nao estou conseguindo o mesmo resultado acredito que e pq agora nao posso usar um sum() por se tratar de um campo string "TAMANHO"
Carlos Eduardo
Curtidas 0
Respostas
Thiago Santana
17/03/2010
Carlos bom dia!
Poste aí como vc está tentando fazer sua instrução SQL, para vermos oq ue está errado e podermos te ajudar!
AbraçoO
Poste aí como vc está tentando fazer sua instrução SQL, para vermos oq ue está errado e podermos te ajudar!
AbraçoO
GOSTEI 0
Emerson Nascimento
17/03/2010
deve ser algo assim:
SELECT
CODIGO,
SUM(CASE WHEN TAMANHO = 'PP' THEN 1 ELSE 0 END) PP,
SUM(CASE WHEN TAMANHO = 'P' THEN 1 ELSE 0 END) P,
SUM(CASE WHEN TAMANHO = 'M' THEN 1 ELSE 0 END) M,
SUM(CASE WHEN TAMANHO = 'G' THEN 1 ELSE 0 END) G,
SUM(CASE WHEN TAMANHO = 'GG' THEN 1 ELSE 0 END) GG,
SUM(CASE WHEN TAMANHO = 'XGG' THEN 1 ELSE 0 END) XGG,
SUM(CASE WHEN TAMANHO = 'BB' THEN 1 ELSE 0 END) BB
FROM
TAMANHOS
GROUP BY
CODIGO
SELECT
CODIGO,
SUM(CASE WHEN TAMANHO = 'PP' THEN 1 ELSE 0 END) PP,
SUM(CASE WHEN TAMANHO = 'P' THEN 1 ELSE 0 END) P,
SUM(CASE WHEN TAMANHO = 'M' THEN 1 ELSE 0 END) M,
SUM(CASE WHEN TAMANHO = 'G' THEN 1 ELSE 0 END) G,
SUM(CASE WHEN TAMANHO = 'GG' THEN 1 ELSE 0 END) GG,
SUM(CASE WHEN TAMANHO = 'XGG' THEN 1 ELSE 0 END) XGG,
SUM(CASE WHEN TAMANHO = 'BB' THEN 1 ELSE 0 END) BB
FROM
TAMANHOS
GROUP BY
CODIGO
GOSTEI 0
Emerson Nascimento
17/03/2010
ou assim:
SELECT
CODIGO,
MAX(CASE WHEN TAMANHO = 'PP' THEN 'S' ELSE 'N' END) PP,
MAX(CASE WHEN TAMANHO = 'P' THEN 'S' ELSE 'N' END) P,
MAX(CASE WHEN TAMANHO = 'M' THEN 'S' ELSE 'N' END) M,
MAX(CASE WHEN TAMANHO = 'G' THEN 'S' ELSE 'N' END) G,
MAX(CASE WHEN TAMANHO = 'GG' THEN 'S' ELSE 'N' END) GG,
MAX(CASE WHEN TAMANHO = 'XGG' THEN 'S' ELSE 'N' END) XGG,
MAX(CASE WHEN TAMANHO = 'BB' THEN 'S' ELSE 'N' END) BB
FROM
TAMANHOS
GROUP BY
CODIGO
SELECT
CODIGO,
MAX(CASE WHEN TAMANHO = 'PP' THEN 'S' ELSE 'N' END) PP,
MAX(CASE WHEN TAMANHO = 'P' THEN 'S' ELSE 'N' END) P,
MAX(CASE WHEN TAMANHO = 'M' THEN 'S' ELSE 'N' END) M,
MAX(CASE WHEN TAMANHO = 'G' THEN 'S' ELSE 'N' END) G,
MAX(CASE WHEN TAMANHO = 'GG' THEN 'S' ELSE 'N' END) GG,
MAX(CASE WHEN TAMANHO = 'XGG' THEN 'S' ELSE 'N' END) XGG,
MAX(CASE WHEN TAMANHO = 'BB' THEN 'S' ELSE 'N' END) BB
FROM
TAMANHOS
GROUP BY
CODIGO
GOSTEI 0
Thiago Santana
17/03/2010
Pelo o que deu para entender deve ser isso aki ki vc precisa:
SELECT
CODIGO,
MAX(PP) "PP",
MAX(P) "P",
MAX(M) "M",
MAX(G) "G",
MAX(GG) "GG",
MAX(XGG) "XGG",
MAX(BB) "BB"
FROM
TAMANHOS
GROUP BY
CODIGO Espero ter ajudado!
AbraçoO
SELECT
CODIGO,
MAX(PP) "PP",
MAX(P) "P",
MAX(M) "M",
MAX(G) "G",
MAX(GG) "GG",
MAX(XGG) "XGG",
MAX(BB) "BB"
FROM
TAMANHOS
GROUP BY
CODIGO Espero ter ajudado!
AbraçoO
GOSTEI 0
Carlos Eduardo
17/03/2010
Bom dia,
Cara ThiiaGuinho e Emerson testei todos os codigos sql e ambos trouxeram o resultado esperado, mas o que eu gostaria realmente se for possivel é não precisar ter que comparar os tamanhos:
EX:
CASE WHEN GRT_TAMANHO = 'PP'
CASE WHEN GRT_TAMANHO = 'P'
CASE WHEN GRT_TAMANHO = 'M'
Pq como vc's podem perber esta tabela Grade de Tamanhos ou seja eu posso ter varias grades tornando criar essa consulta um pouco dificil. Não sei se consegui explicar direito mas resumindo onde faço as comparações dos tamanhos seria interessante fazer de uma forma automatica.
Mas agradeço a atenção de todos e qq novidade é so postar que eu faço um novo teste.
Cara ThiiaGuinho e Emerson testei todos os codigos sql e ambos trouxeram o resultado esperado, mas o que eu gostaria realmente se for possivel é não precisar ter que comparar os tamanhos:
EX:
CASE WHEN GRT_TAMANHO = 'PP'
CASE WHEN GRT_TAMANHO = 'P'
CASE WHEN GRT_TAMANHO = 'M'
Pq como vc's podem perber esta tabela Grade de Tamanhos ou seja eu posso ter varias grades tornando criar essa consulta um pouco dificil. Não sei se consegui explicar direito mas resumindo onde faço as comparações dos tamanhos seria interessante fazer de uma forma automatica.
Mas agradeço a atenção de todos e qq novidade é so postar que eu faço um novo teste.
GOSTEI 0
Thiago Santana
17/03/2010
Carlos pelo o que eu entendi vc quer escolher o tipo de tamanho em tempo de execução no delphi é isso?
Montando um SQL dinâmino, de acordo com o que o usuário escolher?
Tenta explicar melhor!
Tenta explicar melhor!
GOSTEI 0
Carlos Eduardo
17/03/2010
Consegui fazer desta maneira:
1º - Criei uma TSQLQuery (QGrade) para dar um loop nos Tamanhos (PP, P, M, G, etc...)
2º - Depois usei TSQLQuery (QAux) para realmente gerar o codigo SQL completo veja:
3º - e por ultimo usei os componentes TSQLQuery (QAux) + TDataSetProvider + TClientDataSet (CDSTam) + TDataSource e liguei no TDBGrid.
Resultado Final:
OBS: Antes eu estava com dificuldades pq nao queria dar um loop via delphi pra montar a query mas assim ficou muito bom. Valew...
1º - Criei uma TSQLQuery (QGrade) para dar um loop nos Tamanhos (PP, P, M, G, etc...)
2º - Depois usei TSQLQuery (QAux) para realmente gerar o codigo SQL completo veja:
3º - e por ultimo usei os componentes TSQLQuery (QAux) + TDataSetProvider + TClientDataSet (CDSTam) + TDataSource e liguei no TDBGrid.
Resultado Final:
OBS: Antes eu estava com dificuldades pq nao queria dar um loop via delphi pra montar a query mas assim ficou muito bom. Valew...
GOSTEI 0