Consulta SQL - Crosstab

17/03/2010

Estou com a seguinte necessidade:

- 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

Respostas

18/03/2010

Thiago Santana

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
Responder Citar

18/03/2010

Emerson

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
Responder Citar

18/03/2010

Emerson

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
Responder Citar

18/03/2010

Thiago Santana

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
Responder Citar

18/03/2010

Carlos Eduardo

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.
Responder Citar

18/03/2010

Thiago Santana

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!
Responder Citar

18/03/2010

Carlos Eduardo

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...

Responder Citar