Consulta SQL - Crosstab
17/03/2010
0
- 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
Posts
18/03/2010
Thiago Santana
Poste aí como vc está tentando fazer sua instrução SQL, para vermos oq ue está errado e podermos te ajudar!
AbraçoO
18/03/2010
Emerson Nascimento
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
18/03/2010
Emerson Nascimento
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
18/03/2010
Thiago Santana
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
18/03/2010
Carlos Eduardo
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.
18/03/2010
Thiago Santana
Tenta explicar melhor!
18/03/2010
Carlos Eduardo
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...
Clique aqui para fazer login e interagir na Comunidade :)